ROS下创建发布者发布所需话题过程

在ROS下创建一个发布者实时发布所需话题,本人现在需要写一个实时发布目标点的发布者,现记录一下从零开始实现的过程:
我的环境:Ubuntu 16.04、ROS kinetic;

目录

  • 1. 创建工作空间
  • 2. 创建功能包
  • 3. 编写发布者文件
    • 3.1 准备工作:
    • 3.2 编写发布者文件
    • 3.3 修改CmakeLists.txt文件
    • 3.4 编译
    • 3.5 运行可执行文件并查看发布的话题

1. 创建工作空间

打开一个终端:

mkdir  -p ~/target_ws/src   //其中target_ws为我新建的工作空间名
cd ~/target_ws/src
catkin_init_workspace    //初始化工作空间
cd ~/target_ws
catkin_make  //编译,编译完成后,会发现catkin_ws中多了两个文件 build 和 devel
echo "source ~/target_ws/devel/setup.bash" >> ~/.bashrc  
source ~/.bashrc

2. 创建功能包

cd ~/catkin_ws/src/
catkin_create_pkg target_pub std_msgs roscpp rospy   //target_pub为功能包的名称
cd ~/target_ws
catkin_make   //编译功能包

显示以下信息表明创建成功。

ROS下创建发布者发布所需话题过程_第1张图片
此时打开target_ws下的src文件夹,发现里面多了target_pub文件夹,这就是我们刚建的功能包。
ROS下创建发布者发布所需话题过程_第2张图片
里面包括includesrcCmakeList.txtpackage.xml等文件,如下:
ROS下创建发布者发布所需话题过程_第3张图片

3. 编写发布者文件

3.1 准备工作:

想要创建发布者发布消息,首先你要明确你想要发布什么类型的消息。对于我来说,我知道我要发布一个 /move_base_simple/goal的话题,于是我去查看这个话题的发布的消息类型:
指令如下:

 rostopic info /move_base_simple/goal

结果如下:

ROS下创建发布者发布所需话题过程_第4张图片
所以我要发布的消息的消息类型是 geometry_msgs/PoseStamped,于是下一步需要确定此消息类型具体包含的消息格式:
指令如下:

rosmsg show geometry_msgs/PoseStamped

结果如下:

ROS下创建发布者发布所需话题过程_第5张图片
好,现在我们知道了需要发布的消息类型以及消息包含的消息格式,就可以去编写发布者了。

3.2 编写发布者文件

打开target_ws/src/target_pub/src文件夹,在里面新建文件talker.cpp文件,在里面添加代码如下:

/**
 * 该例程将发布/move_base_simple/goal话题,消息类型geometry_msgs/PoseStamped
 */
 
#include 
#include   //geometry_msgs/PoseStamped类型的消息对应的头文件是geometry_msgs/PoseStamped.h

int main(int argc, char **argv)
{
     
	// ROS节点初始化
	ros::init(argc, argv, "my_target");

	// 创建节点句柄
	ros::NodeHandle nh;

	// 创建一个Publisher,发布名为/move_base_simple/goal的topic,消息类型为geometry_msgs::PoseStamped,队列长度1000

  	ros::Publisher target_pub = nh.advertise<geometry_msgs::PoseStamped>("/move_base_simple/goal", 1000);

	// 设置循环的频率
	ros::Rate loop_rate(10);

	int count = 0;
	while (ros::ok())
	{
     
	    // 初始化geometry_msgs::PoseStamped类型的消息
		geometry_msgs::PoseStamped target_msg;

		target_msg.header.stamp = ros::Time::now();
		target_msg.header.frame_id = "world" ;

		target_msg.pose.position.x = 10;
		target_msg.pose.position.y = 0;
		target_msg.pose.position.z = 1;


		target_msg.pose.orientation.x = 0;
		target_msg.pose.orientation.y = 0;
		target_msg.pose.orientation.z = 0;
		target_msg.pose.orientation.w = 1;
	    
		
		// 发布消息

			target_pub.publish(target_msg);
			count ++;
			ROS_INFO("i am publising");

	    // 按照循环频率延时
	    loop_rate.sleep();
	}

	return 0;
}

代码对应的注释我已经写在了程序中。

3.3 修改CmakeLists.txt文件

打开CmakeList.txt文件(路径为:/home/acl/target_ws/src/target_pub,其中acl为我Ubuntu的用户名),在里面添加以下代码:

add_executable (talker src/talker.cpp)
target_link_libraries(talker ${
     catkin_LIBRARIES})

注意:红框为所需添加的代码,其必须要放在黄框中代码的后面。
ROS下创建发布者发布所需话题过程_第6张图片

3.4 编译

打开一个终端,

cd ~/target_ws
catkin_make

出现以下内容则表明编译成功。
ROS下创建发布者发布所需话题过程_第7张图片
此时,打开lib文件夹(路径为/home/acl/target_ws/devel/libacl为我的Ubuntu用户名),发现里面多了target_pub文件夹,即为生成的目标文件夹,里面存放着刚刚编译生成的可执行文件。如图:ROS下创建发布者发布所需话题过程_第8张图片

ROS下创建发布者发布所需话题过程_第9张图片

3.5 运行可执行文件并查看发布的话题

为验证发布的话题是否发布成功,我们运行可执行文件:
打开一个终端:

cd target_ws
source devel/setup.bash
rosrun target_pub talker

出现以下结果则表明话题发布成功。
ROS下创建发布者发布所需话题过程_第10张图片
我们来具体查看一下发布话题的数据:
重新打开一个终端:

rostopic list

ROS下创建发布者发布所需话题过程_第11张图片
红框里的话题即是我们刚刚创建发布者发布的话题。查看一下话题的内容:

rostopic echo /move_base_simple/goal

发布的内容如下图所示,确实是我们发布的消息内容,至此已经成功发布所需的话题消息。
ROS下创建发布者发布所需话题过程_第12张图片

你可能感兴趣的:(#,ROS,#,Ubuntu)