【Micro-XRCE-DDS】使用docker编译代理

为了方便修改xrce-dds代理,特地编译了一个镜像用于编译代理。

编译代理

  1. 安装docker

  2. 安装VSCode和远程插件

  3. 运行镜像

    1
    docker run -itd -p 2019:2019/udp -v agent-build-files:/root/files --name agent-build szc188/micro-xrce-dds-agent-build-env:v2.1.1 /bin/bash
  4. 打开VSCode并连接到容器,打开目录 /root

    接下来的操作都是在VSCode中的终端镜像

  5. 取消默认的代理

    1
    2
    git config --global --unset http.proxy
    git config --global --unset https.proxy
  6. 安装工具

    1
    2
    apt update
    apt install -y net-tools
  7. 拉取源代码

    1
    2
    cd /root/files
    git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git -b v2.1.1
  8. 编译源代码

    1
    2
    3
    cd Micro-XRCE-DDS-Agent && mkdir build && cd build
    cmake ..
    make
  9. 运行代理

    1
    ./MicroXRCEAgent udp4 -p 2019

修改客户端topic名称,兼容ROS2防冲突

为了让编译好的客户端的topic名称在局域网内不会重复,需要根据本机的序列号定制topic名称

  1. 打开 files/Micro-XRCE-DDS-Agent/src/cpp/middleware/fastdds/FastDDSMiddleware.cpp

  2. 搜索 bool FastDDSMiddleware::create_topic_by_xml(

  3. 在这个函数里找到 if (xmlobjects::parse_topic(xml.data(), xml.size(), attrs))

  4. 在这个if里最上面添加如下代码

    1
    2
    3
    4
    5
    6
    extern std::string chiplink_sn;
    std::string str("rt/");
    str += chiplink_sn + "/";
    str += attrs.topicName;
    attrs.topicName = str.c_str();
    std::cout << "####### attrs.getTopicName(): " << attrs.getTopicName() << std::endl;

由于 FastDDS 要求 topic 名称和 FastDDSDataWriter 还有 FastDDSDataReader 的名称必须相同,所以一起改了

  1. 打开 files/Micro-XRCE-DDS-Agent/src/cpp/middleware/fastdds/FastDDSEntities.cpp

  2. 搜索 bool FastDDSDataWriter::create_by_xml(const std::string& xml)

  3. 找到函数里的 if (xmlobjects::parse_publisher(xml.data(), xml.size(), attrs))

  4. 在这个if的第一行添加以下代码

    1
    2
    3
    4
    5
    6
    extern std::string custom_sn;
    std::string str("rt/");
    str += custom_sn + "/";
    str += attrs.topic.topicName;
    attrs.topic.topicName = str.c_str();
    std::cout << "####### FastDDSDataWriter.attrs.topic.topicName: " << attrs.topic.topicName << std::endl;
  5. 搜索 bool FastDDSDataReader::create_by_xml(const std::string& xml)

  6. 找到函数里的 if (xmlobjects::parse_subscriber(xml.data(), xml.size(), attrs))

  7. 在这个if的第一行添加以下代码

    1
    2
    3
    4
    5
    6
    extern std::string custom_sn;
    std::string str("rt/");
    str += custom_sn + "/";
    str += attrs.topic.topicName;
    attrs.topic.topicName = str.c_str();
    std::cout << "####### FastDDSDataReader.attrs.topic.topicName: " << attrs.topic.topicName << std::endl;
  8. 然后打开 files/Micro-XRCE-DDS-Agent/microxrce_agent.cpp

  9. int main(int argc, char** argv) 上面添加

    1
    std::string custom_sn = "test_sn";

【Micro-XRCE-DDS】使用docker编译代理

https://biteax.com/b428ac37.html

作者

石志超

发布于

2022-04-14

更新于

2023-09-27

许可协议