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];
posted on 2024-09-29 10:40  Laurance  阅读(27)  评论(0)    收藏  举报