소스 검색

增加可以直接在ros2下编译使用的软件包offline_voice_module,用户可以直接将该文件夹复制到自己的ROS2工作区目录下src文件夹内就可以了

corvin_zhang 4 주 전
부모
커밋
f2dbab4495

+ 4 - 4
README.md

@@ -75,12 +75,12 @@
 
 ## 1.当使用micro_ros_agent已经与语音模块建立连接,为何使用ros2 topic list命令却看不到语音模块输出的话题列表?
 
-这是因为在你自己的主系统中(如ubuntu系统安装有ROS2完整版本的系统中,即使用type-c线将语音模块连接到的系统中),在用户的home目录下.bashrc文件中配置了ROS_DOMAIN_ID,例如如下所示:
+这是因为在你自己的主系统中(如ubuntu系统安装有ROS2完整版本的系统中,即使用type-c线将语音模块连接到的系统中),在当前用户的home目录下".bashrc"文件中配置了ROS_DOMAIN_ID(取值范围0~232),例如你配置域ID为10,具体如下所示:
 
 `export ROS_DOMAIN_ID=10`
 
-由于ROS_DOMAIN_ID的功能是为了区分不同的ROS2通信网络,我们语音模块默认的ROS_DOMAIN_ID为0,如果您配置ID值为其他的,ROS2系统是禁止不同域ID的话题节点进行通信的。为了保证您当前系统可以正常获取到语音模块发布出来的话题列表,那就需要将您本地的ROS_DOMAIN_ID配置为0就可以了,即将该配置修改为如下所示:
+由于ROS_DOMAIN_ID的功能是为了区分不同的ROS2通信网络,我们语音模块默认是没有配置ROS_DOMAIN_ID参数的,需要将您在本地配置语音模块的域ID就可以了,具体新增配置如下所示:
 
-`export ROS_DOMAIN_ID=0`
+`export XRCE_DOMAIN_ID_OVERRIDE=$ROS_DOMAIN_ID`
 
-这样当语音模块与ROS2系统建立连接后,就可以获取到语音模块发布出来的各话题了。
+新增加该配置后,需要重新打开终端,然后使用命令连接语音模块即可,这样当语音模块与ROS2系统建立连接后,就可以获取到语音模块发布出来的各话题了。

+ 11 - 0
offline_voice_module/.gitignore

@@ -0,0 +1,11 @@
+# ROS 2 colcon workspace outputs
+build/
+install/
+log/
+
+# Colcon local metadata
+.colcon/
+
+# Python cache files that may appear during local development
+__pycache__/
+*.py[cod]

+ 12 - 0
offline_voice_module/src/offline_voice_module/CMakeLists.txt

@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.10)
+project(offline_voice_module)
+
+find_package(ament_cmake REQUIRED)
+
+# 这个包本身不编译节点代码,主要负责安装 launch 和 config 资源文件。
+install(
+  DIRECTORY config launch
+  DESTINATION share/${PROJECT_NAME}
+)
+
+ament_package()

+ 6 - 0
offline_voice_module/src/offline_voice_module/config/offline_voice_module.yaml

@@ -0,0 +1,6 @@
+# 这个配置文件用于集中管理 micro_ros_agent 的启动参数。
+# 当前只配置串口设备路径,后续如果要扩展波特率等字段,也可以继续在这里添加。
+offline_voice_module:
+  micro_ros_agent:
+    serial:
+      dev: /dev/voiceModule

+ 74 - 0
offline_voice_module/src/offline_voice_module/launch/offline_voice_module.launch.py

@@ -0,0 +1,74 @@
+import os
+
+import yaml
+from ament_index_python.packages import get_package_share_directory
+from launch import LaunchDescription
+from launch.actions import DeclareLaunchArgument, LogInfo
+from launch.substitutions import LaunchConfiguration
+from launch_ros.actions import Node
+
+
+DEFAULT_DEV = "/dev/voiceModule"
+
+
+def _load_serial_dev(config_file: str) -> str:
+    """从 YAML 中读取串口设备路径。"""
+    # 这里单独做一个函数,是为了把“读取配置”和“生成启动描述”两个职责拆开,
+    # 后面如果你想继续从 YAML 中读取更多字段,这里会比较容易扩展。
+    if not os.path.exists(config_file):
+        raise FileNotFoundError(f"未找到配置文件: {config_file}")
+
+    with open(config_file, "r", encoding="utf-8") as file:
+        config = yaml.safe_load(file) or {}
+
+    # 配置层级设计成 offline_voice_module -> micro_ros_agent -> serial -> dev,
+    # 这样和原命令 `micro_ros_agent serial --dev ...` 的语义是一一对应的。
+    dev = (
+        config.get("offline_voice_module", {})
+        .get("micro_ros_agent", {})
+        .get("serial", {})
+        .get("dev", DEFAULT_DEV)
+    )
+
+    if not isinstance(dev, str) or not dev.strip():
+        raise ValueError("配置文件中的 dev 必须是非空字符串。")
+
+    return dev
+
+
+def generate_launch_description() -> LaunchDescription:
+    # 先定位安装后的包共享目录,这样无论你是在源码目录还是 install 目录启动,
+    # 都能稳定找到配置文件。
+    package_share_directory = get_package_share_directory("offline_voice_module")
+    config_file = os.path.join(
+        package_share_directory, "config", "offline_voice_module.yaml"
+    )
+
+    default_dev = _load_serial_dev(config_file)
+
+    # 将 YAML 中的 dev 暴露成 launch 参数,保留“配置默认值 + 命令行可覆盖”的灵活性。
+    declare_dev_argument = DeclareLaunchArgument(
+        "dev",
+        default_value=default_dev,
+        description="micro_ros_agent 使用的串口设备路径",
+    )
+
+    micro_ros_agent_node = Node(
+        package="micro_ros_agent",
+        executable="micro_ros_agent",
+        output="screen",
+        emulate_tty=True,
+        # 这里等价替代原命令:
+        # ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/voiceModule
+        # 不同点在于 dev 会优先从 YAML 读取,并且也支持通过 launch 参数临时覆盖。
+        arguments=["serial", "--dev", LaunchConfiguration("dev")],
+    )
+
+    return LaunchDescription(
+        [
+            declare_dev_argument,
+            LogInfo(msg=["加载配置文件: ", config_file]),
+            LogInfo(msg=["当前串口设备: ", LaunchConfiguration("dev")]),
+            micro_ros_agent_node,
+        ]
+    )

+ 22 - 0
offline_voice_module/src/offline_voice_module/package.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0"?>
+<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
+<package format="3">
+  <name>offline_voice_module</name>
+  <version>0.0.1</version>
+  <description>Launch wrapper package for starting micro_ros_agent with YAML-based serial device configuration.</description>
+
+  <maintainer email="corvin@example.com">corvin</maintainer>
+  <license>Apache-2.0</license>
+
+  <buildtool_depend>ament_cmake</buildtool_depend>
+
+  <exec_depend>ament_index_python</exec_depend>
+  <exec_depend>launch</exec_depend>
+  <exec_depend>launch_ros</exec_depend>
+  <exec_depend>micro_ros_agent</exec_depend>
+  <exec_depend>python3-yaml</exec_depend>
+
+  <export>
+    <build_type>ament_cmake</build_type>
+  </export>
+</package>