跳到主要内容

add_poi

服务类型: map_manager/srv/AddPOI

服务名: /poi/add

描述​

添加当前 GRW 地图的 POI。请求中的 poi.id 直接作为该 POI 的最终 id(透传),后续 /poi/list 与 /poi/remove 使用同一 id 即可;请提供非空且在当前图内唯一的 id。实际只读取 poi.id、poi.name 及 poi.pose 的 x、y、theta;不应依赖 type、floor_id、height 或 properties。

请求 (Request)​

字段类型描述
poimap_manager/msg/POIid 透传为最终 id(建议非空唯一);实际使用 id、name、pose.x、pose.y、pose.theta。

响应 (Response)​

字段类型描述
successbool操作是否成功。
messagestring结果消息。

使用示例​

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

命令行调用​

Bash
ros2 service call $ROBOT_NAMESPACE/poi/add map_manager/srv/AddPOI \
"{poi: {id: 'gr_charger_01', name: 'Main Charger', pose: {x: 5.0, y: 3.0, theta: 1.57}}}"

Python 示例​

Python
import rclpy
from geometry_msgs.msg import Pose2D
from map_manager.msg import POI
from map_manager.srv import AddPOI

rclpy.init()
node = rclpy.create_node('add_poi_client')
client = node.create_client(AddPOI, 'poi/add')
client.wait_for_service()

request = AddPOI.Request()
request.poi = POI(id='gr_charger_01', name='Main Charger',
pose=Pose2D(x=5.0, y=3.0, theta=1.57))
future = client.call_async(request)
rclpy.spin_until_future_complete(node, future)
print(future.result().success, future.result().message)
# poi.id 即最终 id;后续 list/remove 使用同一 id
node.destroy_node()
rclpy.shutdown()

C++ 示例​

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

int main(int argc, char* argv[]) {
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("add_poi_client");
auto client = node->create_client<map_manager::srv::AddPOI>("poi/add");
client->wait_for_service();
auto request = std::make_shared<map_manager::srv::AddPOI::Request>();
request->poi.id = "gr_charger_01";
request->poi.name = "Main Charger";
request->poi.pose.x = 5.0;
request->poi.pose.y = 3.0;
request->poi.pose.theta = 1.57;
auto future = client->async_send_request(request);
rclcpp::spin_until_future_complete(node, future);
RCLCPP_INFO(node->get_logger(), "%s", future.get()->message.c_str());
rclcpp::shutdown();
}

相关接口​