2024.9.29 计划
项目
学习
总结
service服务和latch参数的区别
| 特性 | Service | Publisher with Latch |
|---|---|---|
| 通信模式 | 请求-响应式同步通信 | 发布-订阅式异步通信 |
| 数据流 | 一次请求,一次响应 | 持续发布消息(带 latch 可记住最后一条消息) |
| 使用场景 | 明确的数据请求或操作触发 | 状态、配置等需要自动分发给新订阅者的数据 |
| 适合的任务 | 机器人查询当前电量、地图等一次性任务 | 发布静态数据(如地图、初始化参数),无需频繁请求 |
| 订阅者行为 | 每次都需要发起请求并等待响应 | 新订阅者能自动获取发布者的最后一条消息 |
关于ros::shutdown()和直接return 0的区别
| 特性 | ros::shutdown() |
return 0 |
|---|---|---|
| 操作层面 | 负责优雅地关闭与 ROS 相关的所有资源 | 直接退出程序,不做额外的清理操作 |
| 清理 ROS 资源 | 会通知 ROS Master、关闭话题、断开连接、释放资源 | 不会清理 ROS 资源,可能导致资源未释放 |
| 适用场景 | 需要优雅退出节点,确保资源正确释放 | 程序正常退出,适用于简单的无依赖节点 |
| 典型使用场景 | 复杂节点,需要确保关闭顺序和资源释放 | 简单节点,直接退出 |
关于创建自己的头文件并且调用
ROS中的文件系统调用其实类似于springboot,.h文件仅仅是声明一些类(具有某些功能的关联的类可以放在一起),但是并不在.h文件中实现函数功能,而是在一个.cpp文件中来具体实现。
.h文件的格式一般是:
#ifndef _HELLO_H
#define _HELLO_H
/*
namespace
class
run
*/
namespace hello_ns { // 命名空间,防止函数重名
class hello {
private:
/* data */
public:
void run();
};
}
namespace goobye_ns {
class goodbye {
private:
public:
void run();
}
}
#endif
实现这些接口的cpp文件一般格式是:
#include "ros/ros.h"
#include <iostream>
#include "heads/hello.h" // 要包含.h,需要配置c_cpp_properties.json
namespace hello_ns {
void hello::run() {
ROS_INFO("run success");
}
}
最后配置cmakelist文件,比较复杂,修改对应位置即可:
include_directories(
include
${catkin_INCLUDE_DIRS}
)
## Declare a C++ library
add_library(head_src
src/hello.cpp
)
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(usehello src/usehello.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
add_dependencies(head_src ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
add_dependencies(usehello ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
target_link_libraries(head_src
${catkin_LIBRARIES}
)
target_link_libraries(usehello
head_src
${catkin_LIBRARIES}
)
问题是,如果是跨功能包调用怎么配置?还不知道,但是如果不解决这个问题的话后续写代码会出现冗余,增加工作量
关于背包问题求具体方案
其实背包问题都能转化为最短路问题,求具体方案就是,已经知道了结果,回去反推选的路径,也就是把包清空。以01背包,字典序最大为例:
已经走过一边背包问题,得到了答案 \(f[n][m]\)
现在看上一步,\(f[n - 1][m]\) 和 \(f[n - 1][m - v[n]] + w[n]\) 哪一个可以转移到 \(f[n][m]\)?
如果都可以,那么由于希望字典序最大输出,则应该选上第n个反物品。
考虑第其中某一次循环 \(i, j\), f[i][j]$ 表示的是考虑到第 \(i\) 个反物品,还需要清空的体积是 \(j\)
1.要清空的体积 < 反物品体积 (一定不选)
2.要清空的体积 >= 反物品体积 (可选也可不选,但是为了字典序最大,能选就要选)
但是还要注意一个问题,那就是选反物品的时候不能盲目的能选就选,因为这样会导致最后可能没有清掉背包,所以要有迹可循,有一个大方向:
f[i][m] == f[i - 1][j - v[i]] + w[i]满足这个条件说明确实是能转移过去的,这条路是通的。
总的来说就是:
条件1:还能选的上这个物品
条件2:满足f[i][m] == f[i - 1][j - v[i]] + w[i] // 其中m是枚举到现在还剩下的体积,每次确定选上这个物品后 m -= v[i];
浙公网安备 33010602011771号