跳到主要内容

add_virtual_wall

服务类型: map_manager/srv/AddVirtualWall

服务名: /wall/add

描述​

添加一条由起点和终点定义的虚拟墙。GRW 忽略请求的 floor_id 和 wall.floor_id,并分配数值 ID;请保存响应的 wall_id,用于更新或删除。

请求 (Request)​

字段类型描述
floor_idstringIDL 字段;GRW 忽略该值。
wallmap_manager/msg/VirtualWall新增时实际使用 start、end 的 x、y。

响应 (Response)​

字段类型描述
successbool操作是否成功。
messagestring结果消息。
wall_idint32成功时分配的数值虚拟墙 ID。

使用示例​

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

命令行调用​

Bash
ros2 service call $ROBOT_NAMESPACE/wall/add map_manager/srv/AddVirtualWall \
"{wall: {start: {x: 0.0, y: 5.0}, end: {x: 10.0, y: 5.0}}}"

Python 示例​

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

rclpy.init()
node = rclpy.create_node('add_virtual_wall_client')
client = node.create_client(AddVirtualWall, 'wall/add')
client.wait_for_service()

request = AddVirtualWall.Request()
request.wall = VirtualWall(start=Point(x=0.0, y=5.0),
end=Point(x=10.0, y=5.0))
future = client.call_async(request)
rclpy.spin_until_future_complete(node, future)
print(future.result().success, future.result().wall_id)
node.destroy_node()
rclpy.shutdown()

C++ 示例​

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

int main(int argc, char* argv[]) {
rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("add_virtual_wall_client");
auto client = node->create_client<map_manager::srv::AddVirtualWall>("wall/add");
client->wait_for_service();
auto request = std::make_shared<map_manager::srv::AddVirtualWall::Request>();
request->wall.start.x = 0.0;
request->wall.start.y = 5.0;
request->wall.end.x = 10.0;
request->wall.end.y = 5.0;
auto future = client->async_send_request(request);
rclcpp::spin_until_future_complete(node, future);
RCLCPP_INFO(node->get_logger(), "wall_id=%d", future.get()->wall_id);
rclcpp::shutdown();
}

相关接口:ListVirtualWalls、UpdateVirtualWall、RemoveVirtualWall。