Skip to main content

AddVirtualWall

Service type: map_manager/srv/AddVirtualWall

Service name: ${MM}/add_virtual_wall

Description

Add a new virtual wall.

Request

FieldTypeDescription
floor_idstringUnique floor identifier.
wallmap_manager/msg/VirtualWallVirtual-wall data.

Response

FieldTypeDescription
successboolWhether the operation succeeded.
messagestringResult details or an error message.
wall_idint32Unique virtual-wall identifier.

Examples

Example 1

Bash
# Add a horizontal virtual wall
ros2 service call ${MM}/add_virtual_wall map_manager/srv/AddVirtualWall \
"{floor_id: '1F', wall: {id: 1, start: {x: 0.0, y: 5.0, z: 0.0}, end: {x: 10.0, y: 5.0, z: 0.0}}}"

# Add a vertical virtual wall
ros2 service call ${MM}/add_virtual_wall map_manager/srv/AddVirtualWall \
"{floor_id: '1F', wall: {id: 2, start: {x: 5.0, y: 0.0, z: 0.0}, end: {x: 5.0, y: 8.0, z: 0.0}}}"

# Add a diagonal virtual wall
ros2 service call ${MM}/add_virtual_wall map_manager/srv/AddVirtualWall \
"{floor_id: '1F', wall: {id: 3, start: {x: 0.0, y: 0.0, z: 0.0}, end: {x: 5.0, y: 5.0, z: 0.0}}}"

Example 2

Python
from map_manager.srv import AddVirtualWall
from map_manager.msg import VirtualWall
from geometry_msgs.msg import Point
import rclpy
from rclpy.node import Node

class VirtualWallManager(Node):
def __init__(self):
super().__init__('virtual_wall_manager')
self.client = self.create_client(AddVirtualWall, '/add_virtual_wall')
self.client.wait_for_service()
self.next_id = 1

def add_wall(self, floor_id: str, start: tuple, end: tuple, wall_id: int = None):
if wall_id is None:
wall_id = self.next_id
self.next_id += 1

request = AddVirtualWall.Request()
request.floor_id = floor_id
request.wall = VirtualWall(
id=wall_id,
floor_id=floor_id,
start=Point(x=start[0], y=start[1], z=start[2] if len(start) > 2 else 0.0),
end=Point(x=end[0], y=end[1], z=end[2] if len(end) > 2 else 0.0)
)

future = self.client.call_async(request)
rclpy.spin_until_future_complete(self, future)
result = future.result()

if result.success:
print(f"Virtual wall added successfully: ID={result.wall_id}")
else:
print(f"Failed to add: {result.message}")
return result

rclpy.init()
manager = VirtualWallManager()

# Add a rectangular enclosure using four virtual walls
manager.add_wall('1F', (0, 0), (10, 0)) # bottom edge
manager.add_wall('1F', (10, 0), (10, 8)) # right edge
manager.add_wall('1F', (10, 8), (0, 8)) # top edge
manager.add_wall('1F', (0, 8), (0, 0)) # left edge

rclpy.shutdown()

Example 3

C++
#include <rclcpp/rclcpp.hpp>
#include <map_manager/srv/add_virtual_wall.hpp>
#include <map_manager/msg/virtual_wall.hpp>

class VirtualWallManager : public rclcpp::Node {
public:
VirtualWallManager() : Node("virtual_wall_manager"), next_id_(1) {
client_ = create_client<map_manager::srv::AddVirtualWall>(
"/add_virtual_wall");
client_->wait_for_service();
}

bool add_wall(const std::string& floor_id,
double x1, double y1, double x2, double y2,
int wall_id = -1) {
if (wall_id < 0) wall_id = next_id_++;

auto request = std::make_shared<map_manager::srv::AddVirtualWall::Request>();
request->floor_id = floor_id;
request->wall.id = wall_id;
request->wall.floor_id = floor_id;
request->wall.start.x = x1;
request->wall.start.y = y1;
request->wall.start.z = 0;
request->wall.end.x = x2;
request->wall.end.y = y2;
request->wall.end.z = 0;

auto future = client_->async_send_request(request);
if (rclcpp::spin_until_future_complete(shared_from_this(), future) ==
rclcpp::FutureReturnCode::SUCCESS) {
auto result = future.get();
RCLCPP_INFO(get_logger(), "Virtual wall %s: ID=%d",
result->success ? "Added successfully" : "Failed to add", result->wall_id);
return result->success;
}
return false;
}

private:
rclcpp::Client<map_manager::srv::AddVirtualWall>::SharedPtr client_;
int next_id_;
};

Example 4

Text
Virtual-wall segment
━━━━━━━━━━━
▓▓▓▓▓▓▓▓▓▓▓ ← Lethal obstacle (254)
░░░░░░░░░░░░░ ← Inflation area