home/ubuntu20/works/study_third/src/agv_obstacle_avoidance/src/node_main.cpp:30:17: error: no matching function for call to ‘AgvObstaAvoid::LaserObstaAvoid::LaserObstaAvoid()’ 30 | LaserObstaAvoid laser_avoid; | ^~~~~~~~~~~ In file included from /home/ubuntu20/works/study_third/src/agv_obstacle_avoidance/src/node_main.cpp:16: /home/ubuntu20/works/study_third/src/agv_obstacle_avoidance/include/laser_obsta_avoid.h:74:5: note: candidate: ‘AgvObstaAvoid::LaserObstaAvoid::LaserObstaAvoid(const ros::NodeHandle&)’ 74 | LaserObstaAvoid(const ros::NodeHandle& nh); | ^~~~~~~~~~~~~~~ /home/ubuntu20/works/study_third/src/agv_obstacle_avoidance/include/laser_obsta_avoid.h:74:5: note: candidate expects 1 argument, 0 provided
时间: 2023-08-31 20:08:13 浏览: 114
这个错误是由于在 `node_main.cpp` 文件的第 30 行中调用了 `AgvObstaAvoid::LaserObstaAvoid` 的默认构造函数,但是该类只定义了一个带有 `const ros::NodeHandle&` 参数的构造函数。
根据错误信息,您需要在实例化 `LaserObstaAvoid` 对象时提供一个 `ros::NodeHandle` 对象作为参数。您可以尝试修改代码,如下所示:
```cpp
ros::NodeHandle nh;
LaserObstaAvoid laser_avoid(nh);
```
这样就会调用带有 `ros::NodeHandle` 参数的构造函数来实例化 `LaserObstaAvoid` 对象。
请注意,您可能还需要包含正确的头文件并进行必要的命名空间引用。此外,请确保 `ros::NodeHandle` 对象在作用域内有效。
如果问题仍然存在,请检查 `LaserObstaAvoid` 类的构造函数定义以及相关的头文件和命名空间。
相关问题
void AGV::agv_stop() { // 停止AGV运动 std::cout << "AGV stopped." << std::endl; },構造agv_stop的内容
好的,这是一个更完整的 `agv_stop()` 函数的实现,它可以停止 AGV 的运动,并执行一些其他操作,例如将 AGV 从路径规划中删除、更新 AGV 的状态等:
```cpp
void AGV::agv_stop() {
// 停止AGV运动
std::cout << "AGV stopped." << std::endl;
// 从路径规划中删除已经完成的节点
if (!path.empty()) {
path.erase(path.begin());
}
// 更新AGV状态
if (battery < 1) {
setAvailable(false);
}
else {
setAvailable(true);
}
}
```
在这个示例中,`agv_stop()` 函数首先停止 AGV 的运动,并输出一条信息。然后,如果 AGV 的路径规划中仍有节点,它将删除已经完成的节点。最后,它根据 AGV 的电池电量更新 AGV 的可用状态。需要注意的是,这只是一个示例代码,实际上 `agv_stop()` 函数可能需要根据实际情况进行调整,以执行适当的操作。
Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path_to_end = astar.getPath(end_node, end_node1); // 去掉 end_node1 path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path;,修改爲當agv的load狀態等於false時,將agv的current坐標和agv的start坐標輸入到getpath中,並存儲到path中
好的,那么修改后的代码应该是这样的:
```
Astar astar;
std::vector<std::vector<Node*>> paths(agvs.size());
// 得到agv的路綫
for (int i = 0; i < agvs.size(); i++) {
Node* start_node;
Node* end_node;
// 如果AGV的load状态为true,说明AGV当前正在运输货物,那么将其当前坐标和终点坐标输入到getpath中
if (agvs[i].getLoad()) {
start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY());
end_node = new Node(agvs[i].getEndX(), agvs[i].getEndY());
}
// 如果AGV的load状态为false,说明AGV当前没有在运输货物,那么将其当前坐标和起点坐标输入到getpath中
else {
start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY());
end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY());
}
std::vector<Node*> path = astar.getPath(start_node, end_node);
// 如果AGV的load状态为false,说明AGV当前没有在运输货物,那么需要去掉终点节点
if (!agvs[i].getLoad()) {
path.erase(path.begin() + path.size() - 1);
}
paths[i] = path;
}
```
这样修改后,就可以根据AGV的load状态来决定输入到getpath中的终点坐标是起点坐标还是终点坐标,同时还能根据load状态来决定是否需要去掉路径中的终点节点。
阅读全文