在ROS下创建一个发布者实时发布所需话题,本人现在需要写一个实时发布目标点的发布者,现记录一下从零开始实现的过程:
我的环境:Ubuntu 16.04、ROS kinetic;
打开一个终端:
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
cd ~/catkin_ws/src/
catkin_create_pkg target_pub std_msgs roscpp rospy //target_pub为功能包的名称
cd ~/target_ws
catkin_make //编译功能包
显示以下信息表明创建成功。
此时打开target_ws
下的src
文件夹,发现里面多了target_pub
文件夹,这就是我们刚建的功能包。
里面包括include
、src
、CmakeList.txt
、package.xml
等文件,如下:
想要创建发布者发布消息,首先你要明确你想要发布什么类型的消息。对于我来说,我知道我要发布一个 /move_base_simple/goal
的话题,于是我去查看这个话题的发布的消息类型:
指令如下:
rostopic info /move_base_simple/goal
结果如下:
所以我要发布的消息的消息类型是 geometry_msgs/PoseStamped
,于是下一步需要确定此消息类型具体包含的消息格式:
指令如下:
rosmsg show geometry_msgs/PoseStamped
结果如下:
好,现在我们知道了需要发布的消息类型以及消息包含的消息格式,就可以去编写发布者了。
打开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;
}
代码对应的注释我已经写在了程序中。
打开CmakeList.txt
文件(路径为:/home/acl/target_ws/src/target_pub
,其中acl为我Ubuntu
的用户名),在里面添加以下代码:
add_executable (talker src/talker.cpp)
target_link_libraries(talker ${
catkin_LIBRARIES})
打开一个终端,
cd ~/target_ws
catkin_make
出现以下内容则表明编译成功。
此时,打开lib
文件夹(路径为/home/acl/target_ws/devel/lib
,acl
为我的Ubuntu
用户名),发现里面多了target_pub
文件夹,即为生成的目标文件夹,里面存放着刚刚编译生成的可执行文件。如图:
为验证发布的话题是否发布成功,我们运行可执行文件:
打开一个终端:
cd target_ws
source devel/setup.bash
rosrun target_pub talker
出现以下结果则表明话题发布成功。
我们来具体查看一下发布话题的数据:
重新打开一个终端:
rostopic list
红框里的话题即是我们刚刚创建发布者发布的话题。查看一下话题的内容:
rostopic echo /move_base_simple/goal