目录
[二、为什么要配置 VS Code 开发 ROS 2](#二、为什么要配置 VS Code 开发 ROS 2)
[三、ROS 2 开发常用 VS Code 插件推荐](#三、ROS 2 开发常用 VS Code 插件推荐)
[3.1 基础开发类插件](#3.1 基础开发类插件)
[3.2 效率增强类插件](#3.2 效率增强类插件)
[3.3 可选插件](#3.3 可选插件)
[四、解决 ROS 2 头文件报红问题](#四、解决 ROS 2 头文件报红问题)
[4.1 找不到头文件](#4.1 找不到头文件)
[4.2 解决方法](#4.2 解决方法)
[五、推荐的 .vscode 配置文件](#五、推荐的 .vscode 配置文件)
[5.1 c_cpp_properties.json](#5.1 c_cpp_properties.json)
[5.2 settings.json](#5.2 settings.json)
[5.3 tasks.json](#5.3 tasks.json)
[六、安装终端工具 Terminator](#六、安装终端工具 Terminator)
[6.1 安装命令](#6.1 安装命令)
[6.2 启动方式](#6.2 启动方式)
[七、安装 Git](#七、安装 Git)
[7.1 安装命令](#7.1 安装命令)
[7.2 查看帮助](#7.2 查看帮助)
[8.1 打开终端并进入工作空间](#8.1 打开终端并进入工作空间)
[8.2 创建 Python 功能包](#8.2 创建 Python 功能包)
[8.3 编写 Python 节点代码](#8.3 编写 Python 节点代码)
[8.4 编译功能包](#8.4 编译功能包)
[8.5 运行 Python 节点](#8.5 运行 Python 节点)
[8.6 在已有 Python 功能包中继续添加可执行文件](#8.6 在已有 Python 功能包中继续添加可执行文件)
[8.6.1 新建 Python 文件](#8.6.1 新建 Python 文件)
[8.6.2 修改 setup.py](#8.6.2 修改 setup.py)
[8.6.3 重新编译并运行](#8.6.3 重新编译并运行)
[九、使用 Vscode 编写 C++ 代码](#九、使用 Vscode 编写 C++ 代码)
[9.1 打开终端并进入工作空间](#9.1 打开终端并进入工作空间)
[9.2 创建 C++ 功能包](#9.2 创建 C++ 功能包)
[9.3 编写 C++ 节点代码](#9.3 编写 C++ 节点代码)
[9.4 配置 CMakeLists.txt](#9.4 配置 CMakeLists.txt)
[9.5 编译功能包](#9.5 编译功能包)
[9.6 运行 C++ 节点](#9.6 运行 C++ 节点)
[9.7 在已有 C++ 功能包中继续添加可执行文件](#9.7 在已有 C++ 功能包中继续添加可执行文件)
[9.7.1 新建 C++ 文件](#9.7.1 新建 C++ 文件)
[9.7.2 修改 CMakeLists.txt](#9.7.2 修改 CMakeLists.txt)
[9.7.3 重新编译并运行](#9.7.3 重新编译并运行)
一、前言
在 ROS 2 学习与开发过程中,虽然理论上只需要一个文本编辑器和终端就能编写、编译并运行程序,但如果想要提升开发效率、减少配置问题、增强代码补全与跳转能力,那么搭建一套完整的集成开发环境就非常有必要。
在 Ubuntu 22.04 + ROS 2 Humble 的开发场景下,VS Code 是一个非常合适的选择。它轻量、免费、跨平台、插件丰富,并且能够很好地支持 Python、C++、CMake、Git 以及 ROS 2 项目开发。除此之外,终端工具和版本控制工具也是日常开发中不可缺少的部分。
这篇文章就结合实际配置过程,系统整理一套 ROS 2 集成开发环境搭建方案,包括 VS Code 安装、插件推荐、配置文件编写、终端工具安装、Git 安装,以及使用 VS Code 创建并运行 ROS 2 功能包的完整流程。
二、为什么要配置 VS Code 开发 ROS 2
ROS 2 项目通常会同时涉及:
- Python 节点开发
- C++ 节点开发
- CMake / colcon 编译
- package.xml / setup.py / CMakeLists.txt 配置
- 多终端运行与调试
- Git 版本管理
如果不做额外配置,VS Code 在打开 ROS 2 工程时往往会出现以下问题:
#include "rclcpp/rclcpp.hpp"报红- Python 包无法自动补全
- 无法正确跳转到 ROS 2 接口定义
- 编译命令需要每次手动输入
- 工作区中的
build / install / log目录影响搜索体验
因此,提前把 VS Code 配置好,可以明显提升编码、调试和维护效率。
三、ROS 2 开发常用 VS Code 插件推荐
为了让 VS Code 更适合 ROS 2 开发,建议至少安装以下几类插件。
3.1 基础开发类插件
- Python
用于 Python 语法高亮、调试、补全和格式化。- C/C++
用于 C++ 语法分析、头文件跳转、智能提示。- CMake
用于识别和辅助编辑CMakeLists.txt。- CMake Tools
更方便管理 CMake 工程。
3.2 效率增强类插件
- IntelliSense
提供智能补全与跳转支持,是写 ROS 2 代码时非常重要的能力来源。- Code Runner
适合快速执行一些独立代码片段,不过在 ROS 2 项目里更多还是配合终端和 colcon 使用。- ROS
提供对 ROS / ROS 2 工程的额外支持,便于识别相关文件类型和开发场景。
3.3 可选插件
根据个人习惯,还可以安装:
- autopep8:Python 代码格式化
- GitLens:增强 Git 历史查看能力
- Error Lens:更直观显示报错信息
- XML / YAML:方便编辑 launch、参数、配置文件
如果平时 ROS 2 开发以 Python + C++ 混合为主,那么 Python、C/C++、CMake、ROS、IntelliSense 这几类插件基本是必装的。
四、解决 ROS 2 头文件报红问题
4.1 找不到头文件
很多人在 VS Code 中打开 ROS 2 C++ 工程后,最常见的问题就是:
bash
#include "rclcpp/rclcpp.hpp"
会提示找不到头文件。
本质原因在于:VS Code 没有正确配置 includePath,因此 IntelliSense 不知道去哪里查找 ROS 2 的头文件。

4.2 解决方法
当鼠标移动到报错语句时,通常会出现"快速修复"提示,可以选择编辑**includePath 设置** 。
也可以直接在配置文件中加入以下路径:
bash
"includePath": [
"${workspaceFolder}/**",
"/opt/ros/humble/include/**",
"/usr/include/**"
]

如果希望配置更完整一些,也可以加入本地安装路径:
bash
"/usr/local/**",
"/usr/local/include/**"
这些路径能够让 VS Code 正确识别 ROS 2 的头文件和系统库文件。相关配置思路也与你提供的资料一致。
五、推荐的 .vscode 配置文件
为了让 ROS 2 工作空间在 VS Code 中具备更好的补全、跳转和编译体验,建议在工程根目录下新建 .vscode 文件夹,并配置以下文件。
5.1 c_cpp_properties.json
这个文件主要用于配置 C/C++ 头文件搜索路径和编译器信息。
bash
{
"configurations": [
{
"browse": {
"databaseFilename": "${default}",
"limitSymbolsToIncludedHeaders": false
},
"includePath": [
"/usr/include/**",
"/usr/local/**",
"/usr/local/include/**",
"/opt/ros/humble/include/**",
"${workspaceFolder}/**"
],
"name": "ROS2",
"intelliSenseMode": "gcc-x64",
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu11",
"cppStandard": "c++17"
}
],
"version": 4
}
该配置可以让 VS Code 更好地识别ROS 2 的 C++ 工程结构与系统头文件。
5.2 settings.json
这个文件主要用于配置编辑器行为、Python 补全路径、代码格式化以及搜索忽略规则。
bash
{
"editor.tabSize": 8,
"editor.rulers": [
100
],
"files.associations": {
"*.repos": "yaml",
"*.world": "xml",
"*.xacro": "xml",
"chrono": "cpp"
},
"python.autoComplete.extraPaths": [
"/opt/ros/humble/lib/python3.8/site-packages/"
],
"python.envFile": "${workspaceFolder}/.env",
"python.formatting.autopep8Path": "/usr/bin/autopep8",
"python.formatting.autopep8Args": [
"--max-line-length=100"
],
"C_Cpp.default.intelliSenseMode": "gcc-x64",
"C_Cpp.formatting": "Enabled",
"search.exclude": {
"**/node_modules": true,
"**/bower_components": true,
"**/*.code-search": true,
"**/build": true,
"**/install": true,
"**/log": true
},
"python.analysis.extraPaths": [
"/opt/ros/humble/lib/python3.8/site-packages/"
],
"C_Cpp.default.includePath": [
"/usr/include/**",
"/opt/ros/humble/include/**",
"${workspaceFolder}/**"
],
"editor.definitionLinkOpensInPeek": true,
"editor.gotoLocation.alternativeDeclarationCommand": "editor.action.goToImplementation",
"editor.gotoLocation.alternativeImplementationCommand": "editor.action.goToImplementation",
"editor.gotoLocation.alternativeReferenceCommand": "editor.action.goToReferences"
}
这一部分配置的核心作用有三点:
- 让 VS Code 能识别 ROS 2 的 Python 包路径
- 屏蔽
build / install / log等无关目录,提升搜索体验- 强化代码跳转、声明跳转和实现跳转能力
5.3 tasks.json
如果希望在 VS Code 中直接通过快捷键编译 ROS 2 工作空间,可以配置任务文件。
bash
{
"version": "2.0.0",
"tasks": [
{
"label": "colcon make",
"detail": "Build workspace (default)",
"type": "shell",
"command": "colcon build",
"group": {
"kind": "build",
"isDefault": true
},
"problemMatcher": "$gcc"
}
]
}
之后按下:
bash
Ctrl + Shift + B
就可以直接触发编译。
六、安装终端工具 Terminator
ROS 2 开发中经常需要同时打开多个终端,例如:
- 一个终端运行
ros2 daemon- 一个终端编译工程
- 一个终端启动节点
- 一个终端查看 topic / service / node 信息
这时候推荐安装 Terminator。
6.1 安装命令
bash
sudo apt update
sudo apt install terminator
6.2 启动方式
可以在应用菜单中搜索 Terminator,也可以继续使用默认终端快捷键:
bash
Ctrl + Alt + T
Terminator 的优点在于支持终端分屏和多标签管理,比较适合 ROS 2 这种经常多进程联调的开发场景。
七、安装 Git
Git 是日常开发中必不可少的工具,尤其是 ROS 2 学习过程中经常要从 GitHub 或 Gitee 拉取源码仓库。
7.1 安装命令
bash
sudo apt install git
7.2 查看帮助
bash
git --help
八、使用Vscode编写Python代码:
在完成 ROS2 环境安装之后,下一步就是正式开始编写代码。
本节主要介绍如何在 VS Code 中进入工作空间、创建功能包、编写 Python 节点程序,以及在已有功能包中继续添加新的可执行文件。
8.1 打开终端并进入工作空间
在 VS Code 中,可以直接使用快捷键 Ctrl + ~ 打开内置终端。
这样就不需要频繁切换到系统外部终端,开发过程会更加流畅。
打开终端后,先进入自己的 ROS2 工作空间,再切换到**src**目录。例如:
bash
cd ~/ros2_ws/src
这里的 ros2_ws 是工作空间名称,具体以自己的实际目录为准。
之所以进入 src 目录,是因为 ROS2 的功能包通常都创建在工作空间下的 src 文件夹中。后续无论是新建功能包,还是管理已有工程代码,基本都会在这里完成。
8.2 创建 Python 功能包
在 src 目录下,可以通过下面的命令创建一个 Python 类型的 ROS2 功能包:
bash
ros2 pkg create pkg_hellovscode_py --build-type ament_python --dependencies rclpy --node-name helloworld
这条命令的含义如下:
pkg_hellovscode_py:功能包名称--build-type ament_python:指定该功能包使用 Python 构建方式--dependencies rclpy:声明依赖rclpy库--node-name helloworld:自动生成一个名为helloworld的节点入口文件
执行完成后,ROS2 会自动在当前 src 目录下生成该功能包的标准目录结构。
bash
pkg_hellovscode_py/
├── package.xml
├── setup.py
├── setup.cfg
├── resource/
│ └── pkg_hellovscode_py
├── test/
│ ├── test_copyright.py
│ ├── test_flake8.py
│ └── test_pep257.py
└── pkg_hellovscode_py/
├── __init__.py
└── helloworld.py
其中,各部分作用如下:
package.xml:功能包的说明文件,用于声明功能包名称、版本、依赖关系等信息。setup.py:Python 功能包的安装与入口配置文件,后续新增可执行节点时通常需要修改这里。setup.cfg:Python 安装相关配置文件。resource/:功能包资源标识文件所在目录。test/:存放测试相关文件。pkg_hellovscode_py/:Python 模块目录,实际编写的节点代码通常放在这里。__init__.py:用于标识该目录是一个 Python 包。helloworld.py:通过--node-name helloworld自动生成的节点文件。
8.3 编写 Python 节点代码
创建好功能包之后,可以在 VS Code 左侧资源管理器中找到该包,并打开自动生成的 Python 文件进行编辑。
这里编写一个最简单的 ROS2 Python 节点,用来输出一条日志信息。
helloworld.py 示例代码如下:
python
import rclpy
def main(args=None):
# 初始化 ROS2
rclpy.init(args=args)
# 创建节点
node = rclpy.create_node("helloworld_vscode_node")
# 输出日志信息
node.get_logger().info("hello vscode!")
# 关闭 ROS2
rclpy.shutdown()
if __name__ == '__main__':
main()
这段代码的功能比较简单,执行后会创建一个名为 helloworld_vscode_node 的节点,并在终端中输出:hello vscode!
对于初学者来说,可以先重点理解以下几个部分:
rclpy.init(args=args):初始化 ROS2 Python 接口rclpy.create_node(...):创建一个节点对象node.get_logger().info(...):输出日志信息rclpy.shutdown():程序结束时关闭 ROS2
8.4 编译功能包
在完成代码编写之后,需要返回到工作空间根目录进行编译。
假设当前位于 src 目录,那么可以先执行:
bash
cd ..
// 然后使用 colcon build 进行编译:
colcon build
// 如果功能包没有报错,说明编译成功。
8.5 运行 Python 节点
编译完成后,还需要先刷新环境变量:
bash
source install/setup.bash
然后通过 ros2 run 命令运行刚刚编写的节点:
bash
ros2 run pkg_hellovscode_py helloworld
运行成功后,就可以在终端中看到节点输出的信息。
8.6 在已有 Python 功能包中继续添加可执行文件
在实际开发中,一个功能包往往不只包含一个节点程序。
例如,前面已经有一个 helloworld,现在还想在同一个功能包里再增加一个新的可执行文件 helloworld2,这时就需要额外进行配置。
8.6.1 新建 Python 文件
可以先复制已有的 helloworld.py,然后重命名为 helloworld2.py。
修改后的代码如下:
python
import rclpy
def main(args=None):
# 初始化 ROS2
rclpy.init(args=args)
# 创建节点
node = rclpy.create_node("helloworld_vscode_node")
# 输出日志信息
node.get_logger().info("hello vscode!111")
# 关闭 ROS2
rclpy.shutdown()
if __name__ == '__main__':
main()
这个文件本质上也是一个独立的 ROS2 Python 节点,只不过输出内容不同。
8.6.2 修改 setup.py
如果只是新增了 Python 文件,但没有在 setup.py 中注册入口,那么 ROS2 是无法直接运行它的。
因此需要打开功能包中的 setup.py 文件,找到 entry_points 部分,并修改为:
python
entry_points={
'console_scripts': [
'helloworld = pkg_hellovscode_py.helloworld:main',
'helloworld2 = pkg_hellovscode_py.helloworld2:main'
],
},
这里的含义是:
helloworld对应helloworld.py中的main函数helloworld2对应helloworld2.py中的main函数
也就是说,每增加一个可执行 Python 节点,都要在 setup.py 的 console_scripts 中增加一条映射关系。
8.6.3 重新编译并运行
修改完成后,重新在工作空间根目录执行编译:
bash
colcon build
然后刷新环境变量:
bash
source install/setup.bash
最后运行新的节点:
bash
ros2 run pkg_hellovscode_py helloworld2
如果终端正常输出对应内容,就说明新的可执行文件已经配置成功。
九、使用 Vscode 编写 C++ 代码
在完成 ROS2 环境安装之后,除了可以使用 Python 编写节点程序外,也可以使用 C++ 进行开发。在 ROS2 中,C++ 通常通过 rclcpp 接口完成节点创建、消息通信和功能扩展。相较于 Python,C++ 在执行效率、工程部署和大型项目开发中也更加常见。
本节主要介绍如何在 VS Code 中进入工作空间、创建 C++ 功能包、编写 C++ 节点程序,以及在已有功能包中继续添加新的可执行文件。
9.1 打开终端并进入工作空间
在 VS Code 中,可以直接使用快捷键 Ctrl + ~ 打开内置终端。
这样就不需要频繁切换到系统外部终端,开发过程会更加方便。
打开终端后,先进入自己的 ROS2 工作空间,再切换到 src 目录。例如:
bash
cd ~/ros2_ws/src
这里的 ros2_ws 是工作空间名称,具体以自己的实际目录为准。
之所以进入 src 目录,是因为 ROS2 的功能包通常都创建在工作空间下的 src 文件夹中。后续无论是新建功能包,还是管理已有工程代码,基本都会在这里完成。
9.2 创建 C++ 功能包
在 src 目录下,可以通过下面的命令创建一个 C++ 类型的 ROS2 功能包:
bash
ros2 pkg create pkg_hellovscode_cpp --build-type ament_cmake --dependencies rclcpp
这条命令的含义如下:
pkg_hellovscode_cpp:功能包名称--build-type ament_cmake:指定该功能包使用 CMake 构建方式--dependencies rclcpp:声明依赖rclcpp库
执行完成后,ROS2 会自动在当前 src 目录下生成该功能包的标准目录结构。
bash
pkg_hellovscode_cpp/
├── CMakeLists.txt
├── package.xml
├── include/
│ └── pkg_hellovscode_cpp/
└── src/
其中,各部分作用如下:
CMakeLists.txt:C++ 功能包最核心的构建配置文件,用于配置编译规则、依赖项和安装目标等内容。package.xml:功能包的说明文件,用于声明功能包名称、版本、依赖关系等信息。include/:头文件目录,后续如果有自定义类或接口文件,通常放在这里。src/:源文件目录,实际编写的 C++ 节点代码通常放在这里。
与 Python 功能包不同**,C++ 功能包默认不会自动生成节点源文件,因此需要我们自己在 src 目录下新建 .cpp 文件。**
9.3 编写 C++ 节点代码
创建好功能包之后,可以在 VS Code 左侧资源管理器中找到该包,并在 src 目录下新建一个 hellovscode.cpp 文件。
这里编写一个最简单的 ROS2 C++ 节点,用来输出一条日志信息。
hellovscode.cpp 示例代码如下:
cpp
#include "rclcpp/rclcpp.hpp"
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("hello_vscode_node_cpp");
RCLCPP_INFO(node->get_logger(), "hello vscode......");
rclcpp::shutdown();
return 0;
}
这段代码的功能比较简单,执行后会创建一个名为 hello_vscode_node_cpp 的节点,并在终端中输出:hello vscode......
对于初学者来说,可以先重点理解以下几个部分:
rclcpp::init(argc, argv):初始化 ROS2 C++ 接口rclcpp::Node::make_shared(...):创建一个节点对象RCLCPP_INFO(...):输出日志信息rclcpp::shutdown():程序结束时关闭 ROS2
9.4 配置 CMakeLists.txt
由于 C++ 节点需要通过 CMake 进行编译,因此在编写完源文件后,还需要修改功能包中的 CMakeLists.txt 文件。
在文件中增加以下内容:
css
add_executable(hellovscode src/hellovscode.cpp)
ament_target_dependencies(
hellovscode
"rclcpp"
)
install(TARGETS hellovscode
DESTINATION lib/${PROJECT_NAME}
)
这几部分的作用分别如下:
add_executable(hellovscode src/hellovscode.cpp):声明生成一个名为hellovscode的可执行文件,对应源文件为src/hellovscode.cppament_target_dependencies(...):为该可执行文件添加依赖库,这里依赖的是rclcppinstall(...):指定编译后可执行文件的安装路径,ROS2 运行节点时会从这个位置查找
也就是说,在 ROS2 的 C++ 功能包中,每增加一个节点源文件,通常都需要在 CMakeLists.txt 中增加对应的编译和安装配置。
9.5 编译功能包
在完成代码编写和 CMakeLists.txt 配置之后,需要返回到工作空间根目录进行编译。
假设当前位于 src 目录,那么可以先执行:
bash
cd ..
然后使用 colcon build 进行编译:
bash
colcon build
如果功能包没有报错,说明编译成功。
9.6 运行 C++ 节点
编译完成后,还需要先刷新环境变量:
bash
source install/setup.bash
然后通过 ros2 run 命令运行刚刚编写的节点:
bash
ros2 run pkg_hellovscode_cpp hellovscode
运行成功后,就可以在终端中看到节点输出的信息。
9.7 在已有 C++ 功能包中继续添加可执行文件
在实际开发中,一个功能包往往不只包含一个节点程序。
例如,前面已经有一个 hellovscode,现在还想在同一个功能包里再增加一个新的可执行文件 hellovscode2,这时就需要额外进行配置。
9.7.1 新建 C++ 文件
可以先在 src 目录下再新建一个 hellovscode2.cpp 文件。
代码如下:
cpp
#include "rclcpp/rclcpp.hpp"
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
auto node = rclcpp::Node::make_shared("hello_vscode_node_cpp");
RCLCPP_INFO(node->get_logger(), "hello vscode2......");
rclcpp::shutdown();
return 0;
}
这个文件本质上也是一个独立的 ROS2 C++ 节点,只不过输出内容不同。
9.7.2 修改 CMakeLists.txt
如果只是新增了 .cpp 文件,但没有在 CMakeLists.txt 中注册对应的可执行文件,那么 ROS2 是无法直接运行它的。
因此需要打开功能包中的 CMakeLists.txt 文件,加入新的配置内容:
css
add_executable(hellovscode src/hellovscode.cpp)
add_executable(hellovscode2 src/hellovscode2.cpp)
ament_target_dependencies(
hellovscode
"rclcpp"
)
ament_target_dependencies(
hellovscode2
"rclcpp"
)
install(TARGETS hellovscode
DESTINATION lib/${PROJECT_NAME}
)
install(TARGETS hellovscode2
DESTINATION lib/${PROJECT_NAME}
)
这里的含义是:
hellovscode对应hellovscode.cpphellovscode2对应hellovscode2.cpp
也就是说,每增加一个可执行 C++ 节点,都要在 CMakeLists.txt 中增加一组对应的配置,包括:
add_executable(...)ament_target_dependencies(...)install(...)
9.7.3 重新编译并运行
修改完成后,重新在工作空间根目录执行编译:
bash
colcon build
然后刷新环境变量:
bash
source install/setup.bash
最后运行新的节点:
bash
ros2 run pkg_hellovscode_cpp hellovscode2
如果终端正常输出对应内容,就说明新的可执行文件已经配置成功。
十、总结
在 Ubuntu 22.04 下进行 ROS 2 Humble 开发时,VS Code 完全可以作为一款高效且实用的主力 IDE。它本身足够轻量,配合 Python、C/C++、CMake、ROS 等常用插件,并结合合理的 .vscode 配置文件,能够较好地解决 ROS 2 开发过程中常见的头文件报红、代码跳转失效、Python 包无法识别以及编译操作繁琐等问题。其中,c_cpp_properties.json、settings.json 和 tasks.json 等配置文件的完善,对于提升工程开发体验尤为重要。
除此之外,如果再结合 Terminator 进行多终端管理、使用 Git 管理项目版本,并掌握 Python 与 C++ 功能包的创建方法以及多可执行文件的配置方式,就基本能够搭建起一套较为完整的 ROS 2 本地开发环境。这样的环境不仅能够满足入门阶段的学习需求,也能够为后续更深入的项目开发、系统调试和工程管理打下良好基础。
对于刚开始接触 ROS 2 的同学来说,开发环境的配置虽然在前期会花费一定时间,但这一步非常值得。因为一旦环境搭建完善,后续无论是编写节点、调试接口、管理工程,还是阅读源码、开展功能扩展,整体效率都会明显提高。建议尽量在学习初期把开发环境、工具链和基本工作流一次性整理清楚,这样在后续学习 ROS 2 节点通信机制、功能包开发以及系统集成时,就可以把更多精力集中在技术本身,而不是反复被环境问题干扰。