- 为了做自动驾驶,考察了ros2和apollo,最后还是选择了apollo,原因很简单,好移植。apollo用的是bazel编译系统,为了兼容已有工程,我用CMake构建,构建过程中遇到了一些坑,连基本的talker, listen例子也无法正常工作,也在git上反馈过,但是apollo的arm平台是Xavier,只能自己解决,趁项目告一段落特记录如下:
- fastcdr,protobuf序列化的问题,cyber里面调用protobuf序列化后的字符串会含有'\0'结束字符,再经fastcdr序列化时,fastcdr直接转成c-string,导致最终大小不一致。以下underlay_message.cc文件里更新的代码。
void UnderlayMessage::serialize(eprosima::fastcdr::Cdr& scdr) const {
scdr << m_timestamp;
scdr << m_seq;
std::vector<char> data_vector(m_data.size());
data_vector.assign(m_data.begin(), m_data.end());
scdr << data_vector;
scdr << m_datatype;
}
void UnderlayMessage::deserialize(eprosima::fastcdr::Cdr& dcdr) {
dcdr >> m_timestamp;
dcdr >> m_seq;
std::vector<char> data_vector;
dcdr >> data_vector;
m_data.assign(data_vector.begin(), data_vector.end());
dcdr >> m_datatype;
}
- 协程优化问题,release模式或者-O2优化选项,有些语句会被优化调,如果改为debug模式,库的体积又太大,我的解决办法是对特定的函数
static void Yield()__attribute__((optimize("-O0")));
static void Yield(const RoutineState &state)__attribute__((optimize("-O0")));
static void SetMainContext(const std::shared_ptr<RoutineContext> &context)__attribute__((optimize("-O0")));
static CRoutine *GetCurrentRoutine()__attribute__((optimize("-O0")));
static char **GetMainStack()__attribute__((optimize("-O0")));
- fastddr库的第三方memory库,需要确定NODE_SIZE的大小,x86可以自动确定,但是arm平台需要先编译nodesize_dbg工具,再在arm平台上执行生成container_node_sizes_impl.hpp,将其替换掉memory的build目录下src/container_node_sizes_impl.hpp文件,注意在源码的src/CMakeLists.txt里修改如下几行。避免container_node_sizes_impl.hpp被覆盖。
message(WARNING "cannot generate container_node_sizes_impl.hpp, node size information will be unavailable")
#file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/container_node_sizes_impl.hpp "#define FOONATHAN_MEMORY_NO_NODE_SIZE")
#set(FOONATHAN_MEMORY_NO_NODE_SIZE 1 PARENT_SCOPE)