当前位置: 首页 > news >正文

使用 rqt_reconfigure 实时控制 ROS 自定义话题参数

在这里插入图片描述

使用 rqt_reconfigure 实时控制 ROS 自定义话题参数

在 ROS 开发中,经常需要实时调整话题发布的参数(如机器人控制指令)。本文将详细介绍如何通过 rqt_reconfigure 工具快速实现自定义话题的参数动态配置,包括功能包构建、代码实现、常见问题解决等内容,适合 ROS 开发者参考。

一、需求背景

在开发卡车(或移动机器人)控制系统时,需要实时调整油门、刹车、转向等控制指令,并通过 ROS 话题 /truck/send_can1 发布。为了方便调试,我们希望通过可视化界面(rqt)实时修改这些参数,且不影响现有功能包。

自定义话题消息 truck_send_can1.msg 格式如下:

uint8 throttle    # 油门
uint8 brake       # 刹车
uint8 steer_direction  # 转向方向
uint8 steer       # 转向角度
uint8 raise_arm   # 抬臂
uint8 drop_arm    # 落臂
uint8 emergency_stop  # 紧急停止

二、实现思路

  1. 新建独立功能包 truck_rqt_control,避免影响现有代码;
  2. 使用 dynamic_reconfigure 定义可动态配置的参数(对应话题字段);
  3. 编写节点,订阅动态参数更新并发布 truck_send_can1 话题;
  4. 通过 rqt_reconfigure 界面实时修改参数,验证话题输出。

三、详细步骤

1. 环境准备

  • ROS 版本:Noetic(其他版本兼容,部分细节需调整)
  • 依赖包:roscppdynamic_reconfigure、自定义消息包 truck_msgs

2. 功能包结构

新建功能包 truck_rqt_control,结构如下:

truck_rqt_control/
├── cfg/                  # 动态参数配置文件
│   └── TruckCanConfig.cfg
├── src/                  # 节点源代码
│   └── rqt_can_publisher.cpp
├── CMakeLists.txt        # 编译配置
└── package.xml           # 依赖配置

3. 文件实现

(1)package.xml

声明功能包依赖:

<?xml version="1.0"?>
<package format="2"><name>truck_rqt_control</name><version>0.0.0</version><description>使用 rqt_reconfigure 控制 truck_send_can1 话题</description><maintainer email="your@email.com">Your Name</maintainer><license>MIT</license><buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>dynamic_reconfigure</build_depend><build_depend>truck_msgs</build_depend>  <!-- 依赖自定义消息包 --><exec_depend>roscpp</exec_depend><exec_depend>dynamic_reconfigure</exec_depend><exec_depend>truck_msgs</exec_depend><export></export>
</package>
(2)CMakeLists.txt

编译配置文件:

cmake_minimum_required(VERSION 3.0.2)
project(truck_rqt_control)add_compile_options(-std=c++11)find_package(catkin REQUIRED COMPONENTSroscppdynamic_reconfiguretruck_msgs
)# 生成动态配置文件
generate_dynamic_reconfigure_options(cfg/TruckCanConfig.cfg
)catkin_package(CATKIN_DEPENDS roscpp dynamic_reconfigure truck_msgs
)include_directories(${catkin_INCLUDE_DIRS}
)# 编译节点
add_executable(rqt_can_publisher src/rqt_can_publisher.cpp)
target_link_libraries(rqt_can_publisher${catkin_LIBRARIES}
)
# 确保动态配置和消息生成后再编译节点
add_dependencies(rqt_can_publisher${${PROJECT_NAME}_EXPORTED_TARGETS}${catkin_EXPORTED_TARGETS}
)
(3)动态参数配置文件(cfg/TruckCanConfig.cfg)

定义可通过 rqt 调节的参数:

#!/usr/bin/env python3
PACKAGE = "truck_rqt_control"from dynamic_reconfigure.parameter_generator_catkin import ParameterGeneratorgen = ParameterGenerator()# 参数定义:名称、类型、级别、描述、默认值、最小值、最大值
gen.add("throttle",        "int", 0, "油门 (0-100)", 0, 0, 100)
gen.add("brake",           "int", 0, "刹车 (0-100)", 0, 0, 100)
gen.add("steer_direction", "int", 0, "转向方向 (0=左,1=右,2=直)", 2, 0, 2)
gen.add("steer",           "int", 0, "转向角度 (0-90)", 0, 0, 90)
gen.add("raise_arm",       "int", 0, "抬臂 (0=停止,1=抬升)", 0, 0, 1)
gen.add("drop_arm",        "int", 0, "落臂 (0=停止,1=降落)", 0, 0, 1)
gen.add("emergency_stop",  "int", 0, "紧急停止 (0=正常,1=停止)", 0, 0, 1)exit(gen.generate(PACKAGE, "truck_rqt_control", "TruckCanConfig"))

注意:给文件添加可执行权限:

chmod +x cfg/TruckCanConfig.cfg
(4)节点源代码(src/rqt_can_publisher.cpp)

实现参数订阅和话题发布逻辑:

#include <ros/ros.h>
#include <dynamic_reconfigure/server.h>
#include <truck_rqt_control/TruckCanConfigConfig.h>  // 动态配置头文件
#include <truck_msgs/truck_send_can1.h>             // 自定义消息// 全局变量存储当前参数
uint8_t throttle = 0;
uint8_t brake = 0;
uint8_t steer_direction = 2;
uint8_t steer = 0;
uint8_t raise_arm = 0;
uint8_t drop_arm = 0;
uint8_t emergency_stop = 0;// 动态参数更新回调函数(rqt修改参数时触发)
void reconfigureCallback(truck_rqt_control::TruckCanConfigConfig &config, uint32_t level) {ROS_INFO("参数更新: 油门=%d, 刹车=%d, 转向方向=%d, 转向角度=%d, 抬臂=%d, 落臂=%d, 紧急停止=%d",config.throttle, config.brake, config.steer_direction,config.steer, config.raise_arm, config.drop_arm, config.emergency_stop);// 更新全局变量throttle = config.throttle;brake = config.brake;steer_direction = config.steer_direction;steer = config.steer;raise_arm = config.raise_arm;drop_arm = config.drop_arm;emergency_stop = config.emergency_stop;
}int main(int argc, char **argv) {ros::init(argc, argv, "rqt_can_publisher");ros::NodeHandle nh;// 初始化动态配置服务器dynamic_reconfigure::Server<truck_rqt_control::TruckCanConfigConfig> server;dynamic_reconfigure::Server<truck_rqt_control::TruckCanConfigConfig>::CallbackType f;f = boost::bind(&reconfigureCallback, _1, _2);server.setCallback(f);// 发布自定义话题ros::Publisher can_pub = nh.advertise<truck_msgs::truck_send_can1>("/truck/send_can1", 10);// 10Hz循环发布话题ros::Rate loop_rate(10);while (ros::ok()) {truck_msgs::truck_send_can1 msg;// 赋值消息字段msg.throttle = throttle;msg.brake = brake;msg.steer_direction = steer_direction;msg.steer = steer;msg.raise_arm = raise_arm;msg.drop_arm = drop_arm;msg.emergency_stop = emergency_stop;can_pub.publish(msg);ros::spinOnce();loop_rate.sleep();}return 0;
}

4. 编译与运行

(1)编译功能包
cd ~/can_ws
catkin_make
source devel/setup.bash
(2)启动节点
# 终端1:启动ROS核心
roscore# 终端2:启动发布节点
rosrun truck_rqt_control rqt_can_publisher# 终端3:启动rqt_reconfigure界面
rosrun rqt_reconfigure rqt_reconfigure
(3)使用方法
  • rqt_reconfigure 界面左侧选择 rqt_can_publisher 节点;
  • 右侧调节参数(如拖动滑块修改油门值),参数会实时更新到 /truck/send_can1 话题;
  • 验证话题:rostopic echo /truck/send_can1 可查看实时数据。

四、常见问题与解决方案

  1. 错误:AttributeError: 'ParameterGenerator' object has no attribute 'UINT8'
    原因:ROS Noetic 中 dynamic_reconfigure 不支持 UINT8 常量,需用字符串类型。
    解决:将 .cfg 文件中的参数类型改为 "int"(如上述代码)。

  2. 错误:fatal error: truck_rqt_control/TruckCanConfig.h: 没有那个文件或目录
    原因:动态配置生成的头文件名称为 TruckCanConfigConfig.h(自动添加 Config 后缀)。
    解决:代码中引用改为 #include <truck_rqt_control/TruckCanConfigConfig.h>,并同步修改类名。

  3. 参数修改后话题不更新
    原因:节点未正确处理参数回调或发布频率过低。
    解决:检查回调函数是否正确更新全局变量,确保 ros::spinOnce() 被调用。

五、总结

本文通过新建独立功能包 truck_rqt_control,结合 dynamic_reconfigurerqt_reconfigure,实现了自定义话题 truck_send_can1 的参数实时调节。该方案的优势在于:

  • 与现有功能包隔离,安全性高;
  • 可视化界面操作简单,调试效率高;
  • 支持参数范围限制,避免无效值。

通过本文的步骤,开发者可快速搭建类似的动态参数控制系统,适用于机器人控制、传感器调试等场景。

http://www.dtcms.com/a/512341.html

相关文章:

  • 公司电脑做网站网站优化平台有哪些
  • 软件公司网站模版网站首页 栏目页 内容页
  • 【论文精读-4】RBG:通过强化学习分层解决物流系统中的大规模路径问题(Zefang Zong,2022)
  • 慢查询优化
  • 什么大型网站用python做的杭州科技公司排名
  • 四个字网站 域名莱芜金点子信息港最新招聘
  • 【算法笔记】暴力递归尝试
  • 一次学会二分法——力扣278.第一个错误的版本
  • 数据结构——二十七、十字链表与邻接多重链表(王道408)
  • 网站公司做的网站被攻击苏州网络推广
  • 网站权重能带来什么作用灰大设计导航网
  • i.MX6ULL Linux内核启动流程深度解析
  • Browser-Use 打造可操作浏览器的 AI 智能体
  • php网站开发入门到精通教程好玩的游戏网页
  • 代码仓库码云(gitee)配置环境记录
  • 织梦网站模板陶瓷广州建设行业网站
  • 面试(六)——Java IO 流
  • 怎么做视频网站教程php彩票网站建设教程
  • 大模型(Large Language Model, LLM)——什么是大模型,大模型的基本原理、架构、流程
  • 长春网站建设排名怎样用自己电脑做网站
  • 基于 Redis 的基数统计:高效的大规模去重与计数
  • 机械外贸网站站长网站工具
  • 广州企业建站素材安徽禹尧工程建设有限公司网站
  • MySQL if函数
  • Promise.all怎么用
  • 成都网站建设开发价玉环哪里有做网站
  • 01)mysql数据误删恢复相关-mysql5.7 开启 binlog、设置binlog 保留时间
  • 电力电子技术 第五章——非连续导电模式
  • Django 项目 .gitignore 模板
  • MySQL 中文排序(拼音排序)不生效问题全解析