ROS2 接口文档
本文档详细描述了 GR-Navigation 导航系统的所有ROS2接口,包括话题、服务和动作。
特别注意:
如果导航系统在自定义 namespace 下运行,那么所有 node、topic、service、action 都会增加 namespace 前缀,但是消息体结构不会发生变化。
e.g.
| 无 namespace | 有 namespace(robot1) |
|---|---|
| /slam/set_mode | /robot1/slam/set_mode |
ros2 service call /slam/set_mode fourier_msgs/srv/SetMode "{mode: 'mapping'}" | ros2 service call /robot1/slam/set_mode fourier_msgs/srv/SetMode "{mode: 'mapping'}" |
| /slam/mode_status | /robot1/slam/mode_status |
| ros2 topic echo /slam/mode_status | ros2 topic echo /robot1/slam/mode_status |
1. 建图定位模式切换
1.1 /slam/set_mode (服务)
在建图模式和定位模式之间切换
服务类型: fourier_msgs/srv/SetMode
调用示例:
Bash
# 切换到建图模式
ros2 service call /slam/set_mode fourier_msgs/srv/SetMode "{mode: 'mapping'}"
# 切换到定位模式
ros2 service call /slam/set_mode fourier_msgs/srv/SetMode "{mode: 'localization'}"
Python调用:
Python
from fourier_msgs.srv import SetMode
import rclpy
from rclpy.node import Node
class ModeClient(Node):
def __init__(self):
super().__init__('mode_client')
self.client = self.create_client(SetMode, '/slam/set_mode')
self.client.wait_for_service()
def switch_mode(self, mode: str):
request = SetMode.Request()
request.mode = mode
future = self.client.call_async(request)
rclpy.spin_until_future_complete(self, future)
return future.result()
# 使用示例
rclpy.init()
client = ModeClient()
result = client.switch_mode('localization')
print(f"Success: {result.success}, Message: {result.message}")
C++调用:
C++
#include <rclcpp/rclcpp.hpp>
#include <fourier_msgs/srv/set_mode.hpp>
class ModeClient : public rclcpp::Node {
public:
ModeClient() : Node("mode_client") {
client_ = create_client<fourier_msgs::srv::SetMode>("/slam/set_mode");
client_->wait_for_service();
}
bool switch_mode(const std::string& mode) {
auto request = std::make_shared<fourier_msgs::srv::SetMode::Request>();
request->mode = mode;
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(), "Result: %s", result->message.c_str());
return result->success;
}
return false;
}
private:
rclcpp::Client<fourier_msgs::srv::SetMode>::SharedPtr client_;
};
// 使用示例
int main(int argc, char** argv) {
rclcpp::init(argc, argv);
auto client = std::make_shared<ModeClient>();
client->switch_mode("localization");
rclcpp::shutdown();
return 0;
}
1.2 /slam/mode_status (话题)
发布当前系统模式状态
消息类型: std_msgs/msg/String
消息内容:
"mapping"- 建图模式"localization"- 定位模式
订阅示例:
Bash
ros2 topic echo /slam/mode_status
2. 建图模式接口
2.1 /clear_map (话题)
清除当前地图并重启建图
消息类型: std_msgs/msg/String