DynamicEdges Service

Package: nav2_msgs
Category: Nav2 Route Services

Dynamically modify route graph edges during navigation

Message Definitions

Request Message

Field Type Description
closed_edges uint16[] Array of edge IDs to close
opened_edges uint16[] Array of edge IDs to open
adjust_edges EdgeCost[] Array of edges with modified costs

Response Message

Field Type Description
success bool Whether edge modifications were successful

Usage Examples

Python

import rclpy
from rclpy.node import Node
from nav2_msgs.srv import DynamicEdges

class DynamicEdgesClient(Node):
    def __init__(self):
        super().__init__('dynamicedges_client')
        self.client = self.create_client(DynamicEdges, 'route_graph/dynamic_edges')
        
    def send_request(self):
        request = DynamicEdges.Request()
        request.closed_edges = [1, 2, 5]  # Edge IDs to close
        request.opened_edges = [3, 4]     # Edge IDs to open
        request.adjust_edges = []          # No cost adjustments
        
        self.client.wait_for_service()
        future = self.client.call_async(request)
        return future

def main():
    rclpy.init()
    client = DynamicEdgesClient()
    
    future = client.send_request()
    rclpy.spin_until_future_complete(client, future)
    
    if future.result():
        client.get_logger().info('Modify route graph edges dynamically completed')
    else:
        client.get_logger().error('Failed to modify route graph edges dynamically')
        
    client.destroy_node()
    rclpy.shutdown()

C++

#include "rclcpp/rclcpp.hpp"
#include "nav2_msgs/srv/dynamicedges.hpp"

class DynamicEdgesClient : public rclcpp::Node
{
public:
    DynamicEdgesClient() : Node("dynamicedges_client")
    {
        client_ = create_client<nav2_msgs::srv::DynamicEdges>("route_graph/dynamic_edges");
    }

    void send_request()
    {
        auto request = std::make_shared<nav2_msgs::srv::DynamicEdges::Request>();
        request->closed_edges = {1, 2, 5};  // Edge IDs to close
        request->opened_edges = {3, 4};     // Edge IDs to open
        request->adjust_edges = {};          // No cost adjustments

        client_->wait_for_service();
        
        auto result_future = client_->async_send_request(request);
        if (rclcpp::spin_until_future_complete(shared_from_this(), result_future) ==
            rclcpp::FutureReturnCode::SUCCESS)
        {
            RCLCPP_INFO(get_logger(), "Modify route graph edges dynamically completed");
        }
        else
        {
            RCLCPP_ERROR(get_logger(), "Failed to modify route graph edges dynamically");
        }
    }

private:
    rclcpp::Client<nav2_msgs::srv::DynamicEdges>::SharedPtr client_;
};

int main(int argc, char ** argv)
{
    rclcpp::init(argc, argv);
    auto client = std::make_shared<DynamicEdgesClient>();
    
    client->send_request();
    
    rclcpp::shutdown();
    return 0;
}