ROS1学习之编写一个发布者节点

本篇文章介绍我是如何在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 主题名称:统计指定话题中消息包的发送频率

ROS 2(Robot Operating System version 2)中,创建一个节点(node)用于订阅其他节点发布的主题(publisher)是一个常见的任务。这里是一个简单的步骤概述: 1. **安装依赖**: 首先,你需要安装`ros2`包和相关的开发工具,如`colcon`(构建工具),`rosidl_cmake`等。可以使用命令行安装: ``` sudo apt-get update && sudo apt-get install -y ros-$ROS_DISTRO-catkin-colcon ros-$ROS_DISTRO-rosidl-cmake ``` 2. **创建新项目**: 创建一个新的目录并初始化为新的ROS 2包。运行: ``` mkdir your_node_name cd your_node_name colcon init ``` 3. **添加元数据**: 在`package.xml`文件中,配置你的节点的基本信息,比如名称、依赖项等。 4. **编写节点代码**: 在`src`目录下创建一个新的C++文件,例如`your_node.cpp`。使用`rclcpp`库来创建订阅者和发布者。例如,你可以有一个订阅器订阅名为`/input_topic`的消息,并有一个发布器发布名为`/output_topic`的数据。代码大致如下: ```cpp #include <rclcpp/rclcpp.hpp> #include <your_message_type/msg.hpp> // 自定义消息头文件 class YourNode : public rclcpp::Node { public: explicit YourNode(rclcpp::NodeOptions options) : Node("your_node", options) { auto input_subscription = this->create_subscription<your_message_type::msg>( "/input_topic", rclcpp::QoS(rclcpp::KeepLast(10)), // 设置队列深度 [this](const your_message_type::msg::SharedPtr msg) { // 处理接收到的消息... }); } void spin_some() { auto publisher = this->create_publisher<your_message_type::msg>("output_topic"); while (rclcpp::ok()) { // 发布数据... rclcpp::spin_some(*this); } } }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); YourNode node; node.spin_some(); return 0; } ``` 5. **构建和运行**: 在`CMakeLists.txt`文件中添加必要的设置,然后构建和启动节点: ``` find_package(rclcpp REQUIRED) add_executable(your_node src/your_node.cpp) target_link_libraries(your_node rclcpp) ``` 使用`colcon build`构建,然后`colcon run`启动你的节点。 6. **测试**: 确保其他节点已经发布了所需的数据到`/input_topic`,然后观察你的节点是否能正常接收并处理数据,并通过`/output_topic`发布相应的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值