add_forbidden_area
服务类型: map_manager/srv/AddForbiddenArea
服务名: /forbidden/add
描述
添加禁区。GRW 仅接受由四个顶点构成的轴对齐矩形;不符合该约束的输入会失败。GRW 忽略 floor_id,并分配数值 ID。此服务不会创建虚拟墙。
请求 (Request)
| 字段 | 类型 | 描述 |
|---|---|---|
| floor_id | string | IDL 字段;GRW 忽略该值。 |
| area | map_manager/msg/ForbiddenArea | 实际使用 boundary.points 的四个轴对齐矩形顶点。 |
响应 (Response)
| 字段 | 类型 | 描述 |
|---|---|---|
| success | bool | 操作是否成功。 |
| message | string | 结果消息;无效矩形会失败。 |
| area_id | int32 | 成功时分配的数值禁区 ID。 |
| wall_ids | int32[] | 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();
}
注意事项
- 顶点数量:必须恰好提供 4 个顶点。
- 形状限制:4 个顶点必须构成轴对齐矩形;三角形、任意多边形和旋转矩形均不支持。
- 顶点顺序:当前实现根据顶点坐标计算矩形范围,不要求顺时针或逆时针顺序。实现仅校验恰好两种不同的
x值和两种不同的y值;为避免歧义,建议仍按四个不同角点传入。 - 楼层字段:
floor_id为 IDL 兼容字段,GRW 不读取该值。 - 虚拟墙:该服务不会创建虚拟墙,响应中的
wall_ids不包含可用结果。
相关接口
- ListForbiddenAreas - 列出禁区
- UpdateForbiddenArea - 更新禁区
- RemoveForbiddenArea - 删除禁区
- ForbiddenArea - 禁区消息定义