编写一个ROS2节点,节点中包含一个定时器,每隔3秒钟输出一个随机整数
时间: 2024-10-07 15:06:13 浏览: 50
在ROS2中编写一个含有定时器的节点,首先需要安装`rclcpp`库,它是ROS 2的一个C++客户端API。以下是创建这样一个简单节点的基本步骤:
1. 创建一个新的C++包(假设名为`random_timer_node`),并初始化`package.xml`文件。
```xml
<package>
<name>random_timer_node</name>
<version>0.1.0</version>
<description>A ROS2 node that publishes a random integer every 3 seconds.</description>
</package>
```
2. 在`src`目录下创建一个名为`random_publisher.cpp`的源文件,并添加以下内容:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <random>
class RandomPublisher : public rclcpp::Node
{
public:
RandomPublisher()
: timer_(this->create_wall_timer(std::chrono::seconds(3), std::bind(&RandomPublisher::publish_random_number, this)))
{
}
private:
void publish_random_number()
{
// 初始化随机数生成器
std::default_random_engine generator(std::chrono::system_clock::now().time_since_epoch().count());
std::uniform_int_distribution<int> distribution(0, 100); // 随机范围从0到100
int random_number = distribution(generator);
RCLCPP_INFO(get_logger(), "Published random number: %d", random_number);
// 发布消息
auto msg = std_msgs::msg::Int32::SharedPtr(new std_msgs::msg::Int32(random_number));
pub_->publish(*msg);
}
rclcpp::WallTimerBase::SharedPtr timer_;
rclcpp::Publisher<std_msgs::msg::Int32> pub_{this->get_node_base_interface()->get_node_context(), "random_numbers", std_msgs::msg::Int32::TYPE};
};
int main(int argc, char * argv[])
{
rclcpp::init(argc, argv);
auto node = std::make_shared<RandomPublisher>();
rclcpp::spin(node);
return 0;
}
```
3. 在`CMakeLists.txt`中设置构建依赖项和链接`rclcpp`库。
```cmake
find_package(rclcpp REQUIRED)
add_executable(random_timer_node src/random_publisher.cpp)
target_link_libraries(random_timer_node rclcpp)
```
4. 构建并运行此节点:
```sh
cd build
colcon build
source install/local_setup.bash
ros2 run random_timer_node random_timer_node
```
这个节点会每隔3秒发布一个0到100之间的随机整数。
阅读全文