ROS编程第一步: 自己写一个消息发布者和订阅者

明确几点:

我们使用ros的  发布-订阅 机制,编码肯定脱不开ros层的数据类型


一旦我们 编写好了文件,只用做以下几步就可以 运行我们的程序了。

  1. 把你的cpp文件放到
    home/工作空间名/src/功能包名/src 下面
  2. 修改这个文件
    home /工作空间名/src/功能包名/CMakelist文件
    打开,找找有一段 , 一堆#号包围 build
    如图:
    在这里插入图片描述这个时候,你向下找到 一堆#号 包围的 Install, 在它上面添加两句话:
add_executable(你的文件名  src/你的文件名.cpp)

target_link_libraries(你的文件名
   ${catkin_LIBRARIES}
 )

比如我有两个文佳, 一个是 pose_subscriber.cpp ,一个是 velocity_publisher.cpp, 这个时候,我的文件就像下面

在这里插入图片描述 最后一步

回到
	home/你的工作空间
执行: catkin_make       然后 source devel/setup.bash

要是这一步报错,可能是你的cpp文件有语法错误了

然后检验一下运行

rosrun  你的功能包名  你的文件名

没报错就是成功了

贴上 发布者和订阅者的代码

发布者

#include<ros/ros.h>
#include<geometry_msgs/Twist.h>
int main(int argc, char const *argv[])
{	
	
	//ROS节点初始化
	ros::init(argc,argv,"velocity_publisher");
	
	//创建节点句柄
	ros::NodeHandle n;
	
	//创建一个publisher, 发布名为/ turtile1/cmd_vel的topic ,消息类型为geometry_msgs::Twist,队列长度为10
	//注意,尖括号里面你发布的数据类型,这里的 cmd_vel 是你的数据的目的地 
	ros::Publisher  turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel" , 10);
	
	//设置循环频率
	ros::Rate  loop_rate(10);

	int count=0;

	while(ros::ok()){
		//初始化geometry_msg::Twist类型消息
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x=0.5;
		vel_msg.angular.z=0.2
		
		//发布消息
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("publish turtle velocity command[%0.2f m/s , %0.2f rad/s]", vel_msg.linear.x ,vel_msg.angular.z);

		//按循环延时
		loop_rate.sleep();
	}
	return 0;
}
 

订阅者

#include<ros/ros.h>
#include "turtlesim/Pose.h"


void poseCallback(const turtlesim::Pose::ConstPtr& msg){
	//打印接收到的信息
	ROS_INFO("Turtle pose:  x:%0.6f,  y:%0.6f" , msg->x, msg->y);
}


int main(int argc, char **argv)
{
	//初始化ros结点
	 ros::init(argc,argv,"pose_subscriber");
	 //句柄
	 ros::NodeHandle n;

	//实例化一个subscriber , 注册回调函数
	ros::Subscriber pos_sub = n.subscribe("/turtle/pose",10, poseCallback);

	//循环等待回调函数
	ros::spin();


	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章