跳到主要内容

add_forbidden_area

服务类型: map_manager/srv/AddForbiddenArea

服务名: /forbidden/add

描述​

添加禁区。GRW 仅接受由四个顶点构成的轴对齐矩形;不符合该约束的输入会失败。GRW 忽略 floor_id,并分配数值 ID。此服务不会创建虚拟墙。

请求 (Request)​

字段类型描述
floor_idstringIDL 字段;GRW 忽略该值。
areamap_manager/msg/ForbiddenArea实际使用 boundary.points 的四个轴对齐矩形顶点。

响应 (Response)​

字段类型描述
successbool操作是否成功。
messagestring结果消息;无效矩形会失败。
area_idint32成功时分配的数值禁区 ID。
wall_idsint32[]IDL 响应字段;GRW 不创建虚拟墙,不应依赖该字段。

使用示例​

运行前请先完成环境准备:命令行示例需设置 ROBOT_NAMESPACE;Python/C++ 示例使用相对服务名,运行时追加 --ros-args -r __ns:=$ROBOT_NAMESPACE。

命令行调用​

Bash
ros2 service call $ROBOT_NAMESPACE/forbidden/add map_manager/srv/AddForbiddenArea \
"{area: {boundary: {points: [{x: 0.0, y: 0.0}, {x: 2.0, y: 0.0}, {x: 2.0, y: 2.0}, {x: 0.0, y: 2.0}]}}}"

Python 示例​

Python
import rclpy
from geometry_msgs.msg import Point32
from map_manager.msg import ForbiddenArea
from map_manager.srv import AddForbiddenArea

rclpy.init()
node = rclpy.create_node('add_forbidden_area_client')
client = node.create_client(AddForbiddenArea, 'forbidden/add')
client.wait_for_service()

request = AddForbiddenArea.Request()
request.area = ForbiddenArea()
request.area.boundary.points = [
Point32(x=0.0, y=0.0), Point32(x=2.0, y=0.0),
Point32(x=2.0, y=2.0), Point32(x=0.0, y=2.0),
]
future = client.call_async(request)
rclpy.spin_until_future_complete(node, future)
print(future.result().success, future.result().area_id)
node.destroy_node()
rclpy.shutdown()

C++ 示例​

C++
#include <rclcpp/rclcpp.hpp>
#include <map_manager/srv/add_forbidden_area.hpp>

int main(int argc, char* argv[]) {
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("add_forbidden_area_client");
auto client = node->create_client<map_manager::srv::AddForbiddenArea>("forbidden/add");
client->wait_for_service();
auto request = std::make_shared<map_manager::srv::AddForbiddenArea::Request>();
auto& points = request->area.boundary.points;
points.resize(4);
points[0].x = 0.0; points[0].y = 0.0;
points[1].x = 2.0; points[1].y = 0.0;
points[2].x = 2.0; points[2].y = 2.0;
points[3].x = 0.0; points[3].y = 2.0;
auto future = client->async_send_request(request);
rclcpp::spin_until_future_complete(node, future);
RCLCPP_INFO(node->get_logger(), "area_id=%d", future.get()->area_id);
rclcpp::shutdown();
}

注意事项​

  1. 顶点数量:必须恰好提供 4 个顶点。
  2. 形状限制:4 个顶点必须构成轴对齐矩形;三角形、任意多边形和旋转矩形均不支持。
  3. 顶点顺序:当前实现根据顶点坐标计算矩形范围,不要求顺时针或逆时针顺序。实现仅校验恰好两种不同的 x 值和两种不同的 y 值;为避免歧义,建议仍按四个不同角点传入。
  4. 楼层字段:floor_id 为 IDL 兼容字段,GRW 不读取该值。
  5. 虚拟墙:该服务不会创建虚拟墙,响应中的 wall_ids 不包含可用结果。

相关接口​