新手ROS入门编写第一个Topic


本文内容主要是根据 B站中科院软件所-机器人操作系统入门(ROS入门教程)所总结。

程序目的

建立两个node,一个发布模拟的北斗导航消息(格式自定义,包括坐标和工作状态),另一个接收并处理该信息(计算到原点的距离)

程序编写步骤

  • 创建package
  • 编写msg文件设定message格式
  • 编写发布者和订阅者程序(cpp文件)
  • 更改CMakeLists.txt 和package.xml 这两个文件
  • 编译工程,运行程序

代码详细步骤

创建package

  • 代码
$ cd ~/catkin_ws/src #回到源文件目录
$ catkin_create_pkg topic_demo roscpp rospy std_msgs#建立依赖roscpp,rospy,std_msgs的名为topic_demo的package

编写msg文件设定message格式

  • 代码
$ cd topic_demo/
$ mkdir msg
$ cd msg
$ vi bds.msg
  • bds.msg文件
float32 x
float32 y
string state

通过catkin_make命令编译后自动在~/catkin_ws/devel/include/topic_demo/下生成bds.h. 后续使用直接引用即可.引用方式如下:

#include <topic_demo/bds.h>
topic_demo::bds msg;

编写发布者和订阅者程序(cpp文件)

  • 发布者程序(talker.cpp)
#include <ros/ros.h>
#include <topic_demo/bds.h>
int main(int argc, char ** argv){
	ros::init(argc,argv,"talker");	//解析参数,命名当前节点名称为“talker”
	ros::NodeHandle nh;	//创建句柄,实例化节点node
	topic_demo::bds msg;	//创建北斗导航消息
	msg.x = 1.0;
	msg.y = 1.0;
	msg.state = "working";
	ros::Publisher pub =nh.advertise<topic_demo::bds>("bds_info", 1);	//创建publisher,名称为bds_info,缓存大小为1,返回名为pub的对象
	pub.publish(msg);
	ros::Rate loop_rate(1.0);	//定义循环发布频率1Hz
	while(ros::ok()){
		msg.x = 1.03*msg.x;
		msg.y = 1.04*msg.y;
		ROS_INFO("Talker:BDS:x=%f,y=%f",msg.x,msg.y);	//输出当前msg
		pub.publish(msg);
		loop_rate.sleep();	//根据定义的发布频率,如果程序执行时间小于频率值,那程序自动休眠待到时间到的时候再次运行
	}
	return 0;
}

  • 接收者程序(listener.cpp)
#include <ros/ros.h>
#include <topic_demo/bds.h>
#include <std_msgs/Float32.h>
void bdsCallback(const topic_demo::bds::constPtr &msg)
{
	std_msgs::Float32 distance;
	distance.data= sqrt(pow(msg.x, 2) + pow(msg.y, 2));
	ROS_INFO("Listener:Distance to origin = %f, state = %s", distance.data, msg.state.c_str());
}
int main(int argc, char ** argv){
	ros::init(argc,argv,"listener");	//解析参数,命名当前节点名称为“listener”
	ros::NodeHandle n;	//创建句柄,实例化节点node
	topic_demo::bds msg;	//创建北斗导航消息
	ros::Subscriber sub =nh.subscribe("bds_info", 1, bdsCallback);	//创建Subscriber ,接收名称为bds_info的话题,缓存大小为1,使用bdsCallback,返回名为sub 的对象
	ros::spin();	//反复调用当前可触发的回调函数并清空消息,阻塞
	return 0;
}

更改CMakeLists.txt 和package.xml 这两个文件

  • 更改CMakeLists.txt
    在这里插入图片描述
    注意add_executable()函数要在add_dependencies()函数前面
    详细更改可以参考ROS Package构建过程中的CMakeLists文件分析
  • 更改package.xml
    在这里插入图片描述
    有些版本中,没有<run_depend>命令的,变更成<exec_depend>即可使用。

编译工程,运行程序

  • 编译
$ cd ~/catkin_ws/src #回到源文件目录
$ catkin_make #编译工程
  • 更新source
    将当前工作空间的环境添加到当前终端中
$ source ~/catkin_ws/devel/setup.bash 

或者当前工作空间的环境永久添加到运行依赖中

$ echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
  • 运行节点
    • 启动ros核心
$ roscore
+ 运行发送节点
$ rosrun topic_demo talker

在这里插入图片描述

+ 运行接收节点 
$ rosrun topic_demo listener

在这里插入图片描述
结束

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值