本篇文章介绍我是如何在ROS上编写一个ROS Publisher节点的。
一.准备工作
在编写一个发布者节点之前,首先得需要有一个工作空间,方便进行相关的操作和后续代码的编写。在ROS中工作空间是存放ROS功能包的目录结构,而功能包是ROS中代码和配置文件的基本单元。
在终端依次运行如下命令:
mkdir -p ~/catkin_ws/src # 创建工作空间目录
cd ~/catkin_ws/src/ #进入工作空间
catkin_init_workspace #初始化工作空间
生成CMakeLists.txt
cd ~/catkin_ws #返回工作空间根目录
catkin_make #对工作空间进行编译
生成devel和build文件夹
配置环境变量
source ~/catkin_ws/devel/setup.bash
这是临时生效的环境配置,仅对当前终端窗口有效
echo "source ~/catkin_ws/devel/setup.bash">>~/.bashrc
source ~/.bashrc
永久有效,添加到‘.bashrc’
查看环境变量来验证工作空间是否正确配置。
echo $ROS_PAKAGE_PATH
输出应该包含‘/home/用户名/catkin_ws/src’
到这里,我们就完成了一个工作空间的建立,和工作环境的配置。
接下来,我们完成ROS包的创建。
cd ~/catkin_ws/src
#进入工作空间下的src目录
catkin_create_pkg my_package roscpp rospy std_msgs
#创建名为‘my_package’的包
返回根目录并重新编译
cd ~/catkin_ws && catkin_make
到这里我们就完成了一个功能包的创建。
二.发布者节点的编写
1.使用vscode打开my_package
在my_package下的src目录下,创建一个test_node.cpp文件,用作发布者节点的编写。
2.发布者节点的编写
打开test_node.cpp,输入如下代码,保存。
#include <ros/ros.h>
#include <std_msgs/String.h>
//引入ros消息库中的String消息类型
int main(int argc,char *argv[]){
ros::init(argc,argv,"test_node");
//初始化ROS节点
printf("仗剑当空千里去,一更别我二更回!\n");
//节点大管家
ros::NodeHandle nh;
//创建一个发布者(Publisher)对象
ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);
//设置频率对象
ros::Rate loop_rate(10);
while(ros::ok()){
//持续循环,直到ROS节点需要终止
printf("一仗高,随我斩妖除魔!\n");
std_msgs::String msg;
//定义一个ROS标准消息类型(String类型)
msg.data = "剑气长存";
//定义消息数据
pub.publish(msg);
//发布信息
loop_rate.sleep();
//频率设置
}
return 0;
}
3. 修改CMakeLists.txt文件
在文件的末尾输入如下代码:
add_executable(test_node src/test_node.cpp)
#用于定义如何将C++源代码文件编译成可执行文件
target_link_libraries(test_node
${catkin_LIBRARIES}
)
#将ros功能所需要的库链接到名为test_node的可执行文件
三.节点的运行
1.roscore
开启一个终端,运行roscore
该命令是初始化ROS环境并启动关键基础服务
2.rosrun my_package test_node
这里启动test_node节点,发布命令。
运行结果如下:
四.对话题的查看
在ROS1中查看当前系统中的话题,常见的命令是rostopic,共有如下几种命令:
1.rostopic list:列出系统中所有活跃着的话题。
2.rostopic echo 主题名称(例:/chartter):显示指定话题中发送的消息包内容。
消息包中的内容可以通过echo -e []来进行查看
3.rostopic hz 主题名称:统计指定话题中消息包的发送频率