目录
本文内容主要是根据 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
结束