ros2参数通信案例

前言

ros2参数通信测试节点案例。

param_server_node节点

python 复制代码
import rclpy
from rclpy.node import Node
from rclpy.parameter import Parameter


class ParamServerNode(Node):
    def __init__(self):
        super().__init__("param_server_node")
        
        # 初始化参数(支持不同类型)
        self.declare_parameters(
            namespace="",
            parameters=[
                ("int_param", 10),          # 整型参数
                ("float_param", 3.14),      # 浮点型参数
                ("bool_param", True),       # 布尔型参数
                ("string_param", "hello"),  # 字符串参数
                ("list_param", [1, 2, 3])   # 列表参数
            ]
        )

        # 创建定时器,1Hz打印参数
        self.print_timer = self.create_timer(0.1, self.print_parameters_callback)
        self.get_logger().info("参数服务器节点已启动,开始实时打印参数...")

    def print_parameters_callback(self):
        """定时器回调函数:获取并打印所有参数"""
        # 获取所有参数值
        int_param = self.get_parameter("int_param").value
        float_param = self.get_parameter("float_param").value
        bool_param = self.get_parameter("bool_param").value
        string_param = self.get_parameter("string_param").value
        list_param = self.get_parameter("list_param").value

        # 打印参数(带颜色区分)
        self.get_logger().info("\n=== 当前参数值 ===")
        self.get_logger().info(f"整型参数: {int_param}")
        self.get_logger().info(f"浮点参数: {float_param}")
        self.get_logger().info(f"布尔参数: {bool_param}")
        self.get_logger().info(f"字符串参数: {string_param}")
        self.get_logger().info(f"列表参数: {list_param}\n")


def main(args=None):
    rclpy.init(args=args)
    node = ParamServerNode()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info("节点被手动终止")
    finally:
        node.destroy_node()
        rclpy.shutdown()


if __name__ == "__main__":
    main()

param_client_node节点

python 复制代码
import rclpy
from rclpy.node import Node
from rclpy.parameter import Parameter
import random


class ParamClientNode(Node):
    def __init__(self):
        super().__init__("param_client_node")
        
        # 声明定时器间隔参数(默认5秒)
        self.declare_parameter("update_interval", 0.1)
        update_interval = self.get_parameter("update_interval").value

        # 获取参数服务器节点的名称(固定为param_server_node)
        self.target_node_name = "param_server_node"

        # 创建参数修改定时器
        self.update_timer = self.create_timer(update_interval, self.update_parameters_callback)
        
        # 获取参数客户端(用于修改其他节点参数)
        self.param_client = self.create_client(
            rclpy.parameter_service.SetParameters,
            f"/{self.target_node_name}/set_parameters"
        )

        self.get_logger().info(f"参数修改节点已启动,修改间隔: {update_interval}秒")
        self.get_logger().info(f"目标节点: {self.target_node_name}")

    def update_parameters_callback(self):
        """定时器回调:随机修改目标节点的参数"""
        # 生成随机参数值
        new_int = random.randint(0, 100)
        new_float = round(random.uniform(0.0, 10.0), 2)
        new_bool = random.choice([True, False])
        new_string = f"msg_{random.randint(0, 100)}"
        new_list = [random.randint(0, 10) for _ in range(3)]

        # 构建参数更新请求
        parameters = [
            Parameter("int_param", Parameter.Type.INTEGER, new_int),
            Parameter("float_param", Parameter.Type.DOUBLE, new_float),
            Parameter("bool_param", Parameter.Type.BOOL, new_bool),
            Parameter("string_param", Parameter.Type.STRING, new_string),
            Parameter("list_param", Parameter.Type.INTEGER_ARRAY, new_list)
        ]

        # 发送参数更新请求
        request = rclpy.parameter_service.SetParameters.Request()
        request.parameters = [p.to_parameter_msg() for p in parameters]

        # 异步调用参数服务
        future = self.param_client.call_async(request)
        future.add_done_callback(self._on_set_parameters_done)

        # 打印修改日志
        self.get_logger().info("\n=== 修改参数 ===")
        self.get_logger().info(f"整型参数: {new_int}")
        self.get_logger().info(f"浮点参数: {new_float}")
        self.get_logger().info(f"布尔参数: {new_bool}")
        self.get_logger().info(f"字符串参数: {new_string}")
        self.get_logger().info(f"列表参数: {new_list}\n")

    def _on_set_parameters_done(self, future):
        """参数修改请求回调"""
        try:
            response = future.result()
            if all([resp.successful for resp in response.results]):
                self.get_logger().info("参数修改成功!")
            else:
                self.get_logger().error(f"参数修改失败: {response.results}")
        except Exception as e:
            self.get_logger().error(f"参数修改异常: {str(e)}")


def main(args=None):
    rclpy.init(args=args)
    node = ParamClientNode()
    try:
        rclpy.spin(node)
    except KeyboardInterrupt:
        node.get_logger().info("节点被手动终止")
    finally:
        node.destroy_node()
        rclpy.shutdown()


if __name__ == "__main__":
    main()

效果

运行param_server_node节点

bash 复制代码
source install/setup.bash
ros2 run data_monitor param_server_node 

运行param_client_node节点

bash 复制代码
source install/setup.bash
ros2 run data_monitor param_client_node 
相关推荐
AI探索者17 小时前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者17 小时前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
FishCoderh19 小时前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅19 小时前
Python函数入门详解(定义+调用+参数)
python
曲幽20 小时前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama
两万五千个小时1 天前
落地实现 Anthropic Multi-Agent Research System
人工智能·python·架构
哈里谢顿1 天前
Python 高并发服务限流终极方案:从原理到生产落地(2026 实战指南)
python
用户8356290780512 天前
无需 Office:Python 批量转换 PPT 为图片
后端·python
markfeng82 天前
Python+Django+H5+MySQL项目搭建
python·django
GinoWi2 天前
Chapter 2 - Python中的变量和简单的数据类型
python