1.文件名、节点名、入口点名的区别?代码第25行创建节点时的参数就是节点名,在终端使用ros2 node list可以查看当前正在运行的节点。setup.py中entry_points 里面的等号左边的node_helloworld是执行器名字,ros2 run 包名 node_helloworld 就是运行它,用来告诉系统:启动这个脚本里面 main()。2.功能包和节点的区别?答:功能包是存放代码、配置文件的项目文件夹,节点是包里面可以独立运行、完成具体任务的程序进程。下图中,learning_xxx都是功能包,而每个功能包里面具体的.py文件就是节点。3.代码明明放在 src/功能包名/ 源码文件夹里面,为什么我在工作空间根目录,直接敲 ros2 run 包名 入口点名字 就能运行,不用 cd 进到 py 文件所在文件夹?答:首先,src 只是放源代码的文件夹。src下面是你写的.py原始脚本,本身不能直接被ros2 run调用。其次,ros2 run 包名 入口名 不会去 src 里面找文件。它顺着环境变量,去install目录里面查找已经注册好的程序。4.话题和服务的区别?答:话题:发布/订阅模型、订阅者或发布者可以不唯一、异步通信机制、.msg文件定义通信的消息结构。服务:客户端/服务器(CS)模型、同步通信机制、服务器端唯一客户端可以不唯一、.srv文件定义请求和应答数据结构。另外,话题中发布者单向对订阅者发送消息;服务中客户端和服务器端是一问一答式。话题(单向流式)1. 发布者:create_publisher创建发布对象,搭配create_timer定时器周期性publish发数据。2. 订阅者:create_subscription创建订阅对象,传入回调函数,收到消息自动进入回调处理。3. 特点:单向广播,发完即走,不需要返回结果。服务(请求‑应答模式)1. 服务端:create_service创建服务对象,绑定回调,等待客户端请求到来触发回调,处理后返回应答。2. 客户端:create_client创建客户端,调用call_async()发送请求,等待服务端返回结果。3. 特点:一问一答,有去必有回,不是在话题基础上做的封装,是一套独立通信机制。5.话题和服务是怎么进行通信的?答:两种通信都是靠创建对象时同名同类型完成配对,可使用ros2 run rqt_graph rqt_graph可视化,话题里用 publish 发消息,服务里用 call_async 发请求,触发对端的回调来处理数据。6.usr_cam是什么?答:7.colcon build命令是什么?什么时候需要使用这条命令?使用了之后项目空间有什么变化?答:编译指令。以下情况必须执行此命令:(1)第一次新建 / 复制过来功能包;(2)修改了 setup.py、package.xml、自定义 srv/msg 接口文件;(3)新增、删除 py 脚本、新增入口点;(4)改完代码想要运行最新版本(Python 虽然不用编译二进制,也要 build 用来同步文件到 install、更新环境信息)。8.source install/setup.bash 什么用?答:source install/setup.bash会在当前终端窗口加载编译生成的脚本,更新ROS相关环境变量,告知ros2 run等工具到install目录下寻找已经部署好的功能包、可执行程序与自定义通信接口;该操作仅对本终端生效,新开终端需要重新执行,不执行source就无法调用自己编译的包。有个一劳永逸的方法,就是在家目录按下“ctrl+h”,显示隐藏文件,打开.bashrc文件,在最后加上这条指令,需要注意的是,需要把setup.bash文件的完整路径写上(原因:家目录下的.bashrc文件是不是每打开一个终端都会执行一次)。之后甚至不用打开项目空间,直接在家目录中也能运行节点。比如下面的文件路径是/home/nanquan/dev_ws/src/ros2_21_tutorials/learning_tf/learning_tf/static_tf_broadcaster.py,但是在家目录下可以直接运行节点。9.通信接口的定义。答:Ubuntu/opt/ros/jazzy/share中有很多以msg结尾的功能包,这些是ROS官方提供的一系列针对话题的通信接口。而以srv结尾的功能包,是官方提供的针对服务的通信接口。查看常用通信接口上面这个自己编写的通信接口,编译之后ROS2自动生成对应的消息结构体与Python/C++调用代码,整个是一个大的结构体,---是分隔符,上边是Request 请求结构体(客户端发给服务器),下边是Response 响应结构体(服务器返回客户端)。总结一下最上面图中几种通信接口编译之后的结构体:补充一下,ROS2的msg、srv、action所有通信接口都只是数据类模板,必须先实例创建对象,才可以访问、修改内部的成员变量。举例:--------------------------------------------------10.通信接口写好之后,如何使用?答:使用from import引入,引入之后就跟ROS2中标准类型,如String一样使用,比如第27行直接传参。在回调函数中会自动分成2个部分。另外补充一下,在专门定义通信接口的功能包的CMakeLists.txt中的rosidl_generate_interfaces需要加入通信接口文件相对路径。11.除了话题、服务,还有一种通信机制:动作。简单介绍一下。答:客户端/服务器(CS)模型、服