Foxy Fitzroy (狐狸
)
福克斯-菲茨罗伊 是 ROS 2 的第六个版本。
支持的平台
Foxy Fitzroy 主要支持以下平台:
1 级平台:
Ubuntu 20.04 (Focal):
amd64
和arm64
Mac macOS 10.14(Mojave)
Windows 10(Visual Studio 2019)
三级平台:
Ubuntu 20.04 (Focal):
arm32
Debian Buster (10):
amd64
,arm64
和arm32
OpenEmbedded Thud (2.6) / webOS OSE:
arm32
和x86
有关 RMW 实现、编译器/解释器版本和系统依赖性版本的更多信息,请参见 REP 2000.
安装
ROS 2 发布的新功能
在开发过程中 狐狸元票 GitHub 上包含了正在进行的高级别任务的最新状态,并引用了包含更多细节的具体票单。
第 8 版补丁中的更改 (2022-09-28)
启动 GroupAction 范围环境
"(《世界人权宣言》) 设置环境变量
操作现在的作用域为任何 群组行动
返回。
例如,请看下面的启动文件、
舶来品 启动
从 launch.actions 舶来品 设置环境变量
从 launch.actions 舶来品 群组行动
从 launch_ros.actions 舶来品 节点
捍卫 生成发射描述():
返回 启动.启动说明([
设置环境变量(名字='my_env_var';, 价值='1'),
节点(包装='foo';, 可执行='foo';, 产量='屏幕';),
群组行动([
设置环境变量(名字='my_env_var';, 价值='2'),
]),
])
启动>;
<set_env 名称"my_env_var"; value=1";/>;
节点 pkg="foo"; exec="foo"; 输出="屏幕"; />;
组>;
<set_env 名称"my_env_var"; value="2";/>;
</group>;
</launch>;
在第 8 版补丁发布之前,节点 动物
将从 my_env_var=2
但现在它将以 my_env_var=1
.
要退出新行为,可以设置参数 scoped=False
在 群组行动
.
相关门票
第 7 版补丁中的更改 (2022-02-08)
启动 set_env 前端行为更改
发射#468 不经意间改变了行为的范围。 set_env
在前台启动文件中的操作。使用 set_env
操作的作用域不再是父 组
操作,而是全局应用。由于该改动是向后移植的,因此会影响本版本。
我们认为这一改动是一种回归,并打算在下一个补丁版本和未来的 ROS 发行版中修复这一行为。我们还计划修复 Python 启动文件中的行为,因为 Python 启动文件从未正确设置过环境变量。
相关问题
修复启动前端解析器
重构了启动前端解析器,修复了一些问题。 解析特殊字符的问题.因此,在解析字符串时,行为发生了一点变化。例如,以前以字符串形式传递数字时,必须添加额外的引号(如果使用替换,则需要两组引号):
<!--结果是字符串值 "'3'"-->;
参数 名称"foo"; value="''3''"/>;
重构后,上面的字符串将是 "''3''";
(注意多了一组引号)。现在,用户应使用 类型
属性,表示该值应被解释为字符串:
参数 名称"foo"; value="3"; type="str";/>;
相关拉取请求:
修复 rmw_fastrtps_dynamic_cpp 中的内存泄漏和未定义的行为
更改了以下头文件中的应用程序接口:
rmw_fastrtps_dynamic_cpp/TypeSupport.hpp
rmw_fastrtps_dynamic_cpp/TypeSupport_impl.hpp
虽然从技术上讲,它们是可公开访问的,但人们不太可能直接使用它们。因此,我们决定破解 API,以修复内存泄漏和未定义的行为。
该修正最初是在 rmw_fastrtps#429 后来在 rmw_fastrtps#577.
第 2 版补丁中的更改 (2020-08-07)
静态变换发布器中的错误
在开发 Foxy 的过程中,tf2_ros static_transform_publisher 程序出现了一个错误。传递给 static_transform_publisher 的欧拉角顺序的实现与文档不符。Foxy 第 2 版补丁 修复 顺序,以便实现与文档一致(偏航、俯仰、滚动)。对于已经开始使用 Foxy 初版或补丁 1 的用户来说,这意味着任何使用 static_transform_publisher 的启动文件都必须根据新的顺序更换命令行顺序。对于从 ROS 2 Dashing、ROS 2 Eloquent 或 ROS 1 移植到 Foxy 补丁版本 2 的用户来说,无需做任何更改。
自 Eloquent 发布以来的变化
经典 CMake 与现代 CMake
在 "经典 "CMake 中,软件包提供 CMake 变量,如 <pkgname>_INCLUDE_DIRS
和 <pkgname>_LIBRARIES
当被 find_package()
-ed。与 ament_cmake
通过调用 ament_export_include_directories
和 AEMENT_EXTORT_LIBRARY
.与 ament_export_dependencies
, ament_cmake
确保递归依赖关系的所有包含目录和库都被连接并包含在这些变量中。
在 "现代 "CMake 中,软件包会提供一个接口目标(通常命名为 <pkgname>::<pkgname>;
) 本身就封装了所有递归依赖关系。为了导出一个库目标以使用现代 CMake 输出目标
需要调用一个导出名称,在使用 install(TARGETS libA>; libB>; 出口 <export_name>; ...)
.导出的接口目标可通过 CMake 变量 <pkgname>_TARGETS
.库目标要像这样导出,就不能依赖于影响全局状态的经典函数,如 include_directories()
但要在目标机上设置 include 目录(用于构建和安装环境),可以使用生成器表达式,例如 target_include_directories(<target>; 公众 "$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"; "$<INSTALL_INTERFACE:include>")
.
何时 ament_target_dependencies
用于为目标库添加依赖关系,该函数会在现代 CMake 目标可用时使用它们。否则就会退回到使用传统 CMake 变量。因此,只有在所有依赖库都提供现代 CMake 目标的情况下,才能导出现代 CMake 目标。
否则,导出的接口目标将在生成的 CMake 逻辑中包含包含目录/库的绝对路径,从而使软件包不可重新定位。
有关 Foxy 如何将软件包更新为现代 CMake 的例子,请参阅 ros2/ros2#904.
ament_export_interfaces 被 ament_export_targets 取代
CMake 函数 输出接口
从包装 ament_cmake_export_interfaces
功能已被弃用,取而代之的是 输出目标
在新软件包中 ament_cmake_export_targets
.请参见 GitHub ticket 附件/参数_制作#237 了解更多详情。
rosidl_generator_|cpp命名空间/API变更
套餐 生成器 C
和 rosidl_generator_cpp
进行了重构,将许多头文件和源文件移到了新软件包中 ROSIDL_RUNTIME_C
和 rosidl_runtime_cpp
.这样做的目的是移除对生成器包的运行依赖,从而移除使用 Python 的代码生成工具。在移动头文件的同时,包含路径/命名空间也会相应更新,因此在许多情况下,将生成器软件包中的包含指令更改为运行时软件包中的包含指令即可。
生成的 C / C++ 代码也经过了重构。以 __struct.h|hpp
, __functions.h
, __traits.hpp
等已被移至子目录 细节
但大多数代码只包含以接口命名的头,而不包含任何这些后缀。
有关字符串和序列边界的一些类型也已重命名,以符合命名约定,但用户代码中不会使用这些类型(高于 RMW 实现和类型支持包)。
更多信息,请参见 ros2/rosidl#446(用于 C 语言) 和 ros2/rosidl#447(适用于 C++).
ament_add_test 的默认工作目录
添加的测试的默认工作目录 添加测试
改为 cmake_current_binary_dir
的行为相匹配 添加测试
.要么更新测试以使用新的默认设置,要么通过 工作目录 ${cmake_source_dir}
恢复之前的值。
默认控制台日志格式
控制台默认日志输出格式已更改,默认情况下包含时间戳,请参见:
默认控制台日志输出流
从 Foxy 开始,所有严重级别的日志信息默认都会记录到 stderr。这确保了日志信息的即时发布,并使 ROS 2 日志系统与大多数其他日志系统保持一致。在运行时,可以通过 RCUTILS_LOGGING_USE_STDOUT 环境变量将数据流更改为 stdout,但所有日志信息仍会记录到同一数据流中。参见 https://github.com/ros2/rcutils/pull/196 了解更多详情。
发射
节点名称和命名空间参数已更改
"(《世界人权宣言》) 节点
与命名有关的操作参数已更改:
节点名
已更名为名字
节点名称空间
已更名为命名空间
节点可执行
已更名为可执行
exec_name
用于命名与节点相关的进程。以前,用户会使用名字
关键字参数。
旧参数已被淘汰。
这些改动是为了让启动前端更易于使用。例如,用
节点 pkg="demo_nodes_cpp"; exec=健谈; node-name="foo"; />;
我们现在可以写出
节点 pkg="demo_nodes_cpp"; exec=健谈; 名称"foo"; />;
这一变更也适用于 可组合节点容器
, 可组合节点
和 生命周期节点
.有关示例,请参见 对演示进行相关修改。
rclcpp
更改高级订阅回调签名
拉取请求 https://github.com/ros2/rclcpp/pull/1047 回调的签名发生了变化。以前它使用 rmw
类型 rmw_message_info_t
但现在使用 rclcpp
类型 rclcpp::MessageInfo
.所需的更改非常简单,可以在这些拉取请求中看到:
序列化报文回调签名的更改
拉动请求 ros2/rclcpp#1081 引入了一种新的回调签名,用于检索序列化形式的 ROS 消息。以前使用的 C-Struct rcl_serialized_message_t 将被 C++ 数据类型 rclcpp::SerializedMessage.
中的示例节点 演示节点
即 对话者序列化信息
以及 监听器序列化消息
反映这些变化。
节点接口获取器签名的破坏性更改
拉取请求 ros2/rclcpp#1069修改了节点接口获取器的签名,以返回节点接口的共享所有权(即一个 std::shared_ptr
) 而不是非所有原始指针。依赖于先前签名的下游软件包所需的更改简单明了:使用 std::shared_ptr::get()
方法。
弃用 set_on_parameters_set_callback
取而代之的是使用 rclcpp::Node
方法 add_on_set_parameters_callback
和 remove_on_set_parameters_callback
用于添加和删除参数设置时调用的函数。
Publisher 获取器签名的破坏性更改
拉取请求 ros2/rclcpp#1119,对发布者句柄获取器的签名进行了修改,以返回底层 rcl 结构的共享所有权(即一个 std::shared_ptr
) 而不是非所有原始指针。这对于修复某些情况下的分离故障是必要的。依赖于先前签名的下游软件包所需的更改简单明了:使用 std::shared_ptr::get()
方法。
rclcpp_action
弃用 ClientGoalHandle::async_result()
使用该应用程序接口可能会遇到竞赛条件,导致抛出异常。因此,最好使用 客户端::async_get_result()
这样更安全。
参见 ros2/rclcpp#1120 和相关问题,以获取更多信息。
rclpy
支持多个参数设置回调
使用 节点
方法 add_on_set_parameters_callback
和 remove_on_set_parameters_callback
用于添加和删除参数设置时调用的函数。
方法 设置参数回调
已被弃用。
相关拉取请求: https://github.com/ros2/rclpy/pull/457, https://github.com/ros2/rclpy/pull/504
rmw_connext_cpp
Connext 5.1 定位器种类兼容模式
包括以下内容 能言善辩
, rmw_connext_cpp
正在设置 dds.transport.use_510_compatible_locator_kinds
属性为 真
.该属性不再被强制使用,而在......之间共享传输通信。 Foxy
和以前的版本将停止工作。类似日志
PRESParticipant_checkTransportInfoMatching:Warning: 所发现 远程 与会者 RTI管理控制台'; 使用 的 'shmem'; 运输 与 类 身份证 16777216.这 类 身份证 是否 不 比赛 的 类 身份证 2 的 的 一样 运输 于 的 当地 与会者 'talker';.这些 二 与会者 将 不 传达 越过 的 'shmem'; 运输。检查 的 价值 的 的 财产 'dds.transport.use_510_compatible_locator_kinds'; 于 的 当地 与会者。参见 https://community.rti.com/kb/what-causes-error-discovered-remote-participant 对于 其他 信息
当出现这种不兼容情况时,将观察到
如果需要兼容性,可在包含 QoS 配置文件的外部文件中进行设置:
<participant_qos>;
<property>;
<value>;
元素;
<名称>;
dds.transport.use_510_compatible_locator_kinds
</名称>;
<value>;1</value>;
</元素>;
</value>;
</property>;
</participant_qos>;
记住设置 ndds_qos_profiles
环境变量的 QoS 配置文件路径。更多信息,请参阅 如何 至 改变 运输 设置 于 5.2.0 应用 对于 兼容性 与 5.1.0
部分 运输_兼容性.
rviz
工具使用 ROS 时间为信息打上时间戳
现在,"二维姿势估计"、"二维导航目标 "和 "发布点 "工具使用 ROS 时间而不是系统时间为其信息打上时间戳,以便于 使用模拟时间
参数对它们产生影响。
std_msgs
停用信息
尽管长期以来我们一直不鼓励使用下列信息,但我们已正式弃用 std_msgs
.在 接口示例
std_msgs/msg/Bool
std_msgs/msg/Byte
std_msgs/msg/ByteMultiArray
std_msgs/msg/Char
std_msgs/msg/Float32
std_msgs/msg/Float32MultiArray
std_msgs/msg/Float64
std_msgs/msg/Float64MultiArray
std_msgs/msg/Int16
std_msgs/msg/Int16MultiArray
std_msgs/msg/Int32
std_msgs/msg/Int32MultiArray
std_msgs/msg/Int64
std_msgs/msg/Int64MultiArray
std_msgs/msg/Int8
std_msgs/msg/Int8MultiArray
std_msgs/msg/MultiArrayDimension
std_msgs/msg/MultiArrayLayout
std_msgs/msg/String
std_msgs/msg/UInt16
std_msgs/msg/UInt16MultiArray
std_msgs/msg/UInt32
std_msgs/msg/UInt32MultiArray
std_msgs/msg/UInt64
std_msgs/msg/UInt64MultiArray
std_msgs/msg/UInt8
std_msgs/msg/UInt8MultiArray
安全功能
使用安全飞地
从 Foxy 开始,域参与者不再直接映射到 ROS 节点。因此,ROS 2 的安全功能(针对域参与者)也不再直接映射到 ROS 节点。取而代之的是,Foxy 引入了安全 "飞地 "的概念,"飞地 "是指共享相同身份和访问控制规则的一个或一组进程。
这意味着安全人工制品 不 不再根据节点名称检索,而是根据安全飞地名称检索。节点飞地名称可以通过使用 ROS 参数 --飞地
例如 玫瑰2 运行 演示节点 话匣子 --ros-args --飞地 /my_enclave
相关设计文件: https://github.com/ros2/design/pull/274
请注意,权限文件受底层传输包大小的限制,因此将许多权限归入同一飞地将 不 如果生成的权限文件超过 64kB,则无法正常工作。相关问题 [ros2/sros2#228]
重新命名环境变量
在 Eloquent 中的名称 |
Foxy 中的名称 |
---|---|
ros_security_root_directory |
ros_security_keystore |
安全节点目录 |
ros_security_enclave_override |
已知问题
[ROS2/ROS2#922] 服务表现不稳定的原因
rclcpp
使用 eProsima Fast-RTPS 或凌动 CycloneDDS 作为 RMW 实现的节点。具体来说,服务客户端有时收不到服务器的响应。[ros2/rclcpp#1212] 就绪的可重入等待对象可以尝试执行多次。
发布前的时间表
发布前的几个里程碑: