Foxy Fitzroy (foxy
)
Foxy Fitzroy 是 ROS 2 的第六个版本。
支持的平台
Foxy Fitzroy 主要支持以下平台:
第 1 层平台:
Ubuntu 20.04 (Focal):“amd64”和“arm64”
Mac macOS 10.14 (Mojave)
Windows 10 (Visual Studio 2019)
第 3 层平台:
Ubuntu 20.04 (Focal):“arm32”
Debian Buster (10):“amd64”、“arm64”和“arm32”
OpenEmbedded Thud (2.6) / webOS OSE:“arm32”和“x86”
有关 RMW 实现、编译器/解释器版本和系统依赖项版本的更多信息,请参阅“REP 2000 <https://www.ros.org/reps/rep-2000.html>`__。
安装
此 ROS 2 版本中的新功能
在开发过程中,GitHub 上的 Foxy 元票证 包含正在进行的高级任务的最新状态,并引用了具有更多详细信息的特定票证。
补丁版本 8 中的更改(2022-09-28)
启动 GroupAction 范围环境
SetEnvironmentVariable
操作现在范围为它返回的任何 GroupAction
。
例如,考虑以下启动文件,
import launch
from launch.actions import SetEnvironmentVariable
from launch.actions import GroupAction
from launch_ros.actions import Node
def generate_launch_description():
return launch.LaunchDescription([
SetEnvironmentVariable(name='my_env_var', value='1'),
Node(package='foo', executable='foo', output='screen'),
GroupAction([
SetEnvironmentVariable(name='my_env_var', value='2'),
]),
])
<launch>
<set_env name="my_env_var" value="1"/>
<node pkg="foo" exec="foo" output="screen" />
<group>
<set_env name="my_env_var" value="2"/>
</group>
</launch>
在补丁版本 8 之前,节点“foo”将以“my_env_var=2”开头,但现在它将以“my_env_var=1”开头。
要退出新行为,您可以在“GroupAction”上设置参数“scoped=False”。
相关票证:
补丁版本 7 中的更改(2022-02-08)
启动 set_env 前端行为更改
launch#468 无意中将行为更改为前端启动文件中 set_env
操作的范围。
使用 set_env
操作对环境变量的更改不再局限于父 group
操作,而是全局应用。
由于它是反向移植的,因此更改会影响此版本。
我们认为此更改是一种回归,并打算在下一个补丁版本和未来的 ROS 发行版中修复此行为。 我们还计划修复 Python 启动文件中的行为,这些文件从未正确设置环境变量。
相关问题:
修复启动前端解析器
启动前端解析器的重构修复了一些`解析特殊字符的问题<https://github.com/ros2/launch_ros/issues/214>`_。 因此,在解析字符串时,行为发生了微小的变化。 例如,以前要将数字作为字符串传递,您必须添加额外的引号(如果使用替换,则需要两组引号):
<!-- results in the string value "'3'" -->
<param name="foo" value="''3''"/>
重构后,上述内容将产生字符串“”3“””(请注意额外的引号)。 现在,用户应该使用“type”属性来表示该值应该被解释为字符串:
<param name="foo" value="3" type="str"/>
相关请求:
修复 rmw_fastrtps_dynamic_cpp 中的内存泄漏和未定义行为
API 在以下头文件中进行了更改:
rmw_fastrtps_dynamic_cpp/TypeSupport.hpp
rmw_fastrtps_dynamic_cpp/TypeSupport_impl.hpp
虽然从技术上讲,它们是公开可访问的,但人们不太可能直接使用它们。 因此,我们决定破坏 API 以修复内存泄漏和未定义的行为。
修复最初提交于 rmw_fastrtps#429 中,后来在 rmw_fastrtps#577 中反向移植到 Foxy。
补丁版本 2 中的更改(2020-08-07)
static_transform_publisher 中的错误
在 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 中,包在被“find_package()”处理时会提供 CMake 变量,如“<pkgname>_INCLUDE_DIRS”和“<pkgname>_LIBRARIES”。 使用“ament_cmake”,可通过调用“ament_export_include_directories”和“ament_export_libraries”来实现。 与“ament_export_dependencies”结合,“ament_cmake”可确保所有包含递归依赖项的目录和库都连接在一起并包含在这些变量中。
在“现代”CMake 中,包提供了一个接口目标(通常名为“<pkgname>::<pkgname>”),该接口目标本身封装了所有递归依赖项。
为了导出库目标以使用现代 CMake,需要使用导出名称调用 ament_export_targets
,该名称在使用 install(TARGETS <libA> <libB> EXPORT <export_name> ...)
安装库时也会使用。
导出的接口目标可通过 CMake 变量 <pkgname>_TARGETS
获得。
要使库目标像这样可导出,它们不能依赖于影响全局状态的经典函数,如 include_directories()
,而是在目标本身上设置包含目录 - 用于构建和安装环境 - 使用生成器表达式,例如 target_include_directories(<target> PUBLIC "$<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 取代
包“ament_cmake_export_interfaces”中的 CMake 函数“ament_export_interfaces”已被弃用,取而代之的是新包“ament_cmake_export_targets”中的函数“ament_export_targets”。 有关更多上下文,请参阅 GitHub 票证“ament/ament_cmake#237 <https://github.com/ament/ament_cmake/issues/237>”_。
rosidl_generator_c|cpp 命名空间 / API 更改
软件包 rosidl_generator_c
和 rosidl_generator_cpp
已重构,许多标头和源代码已移至新软件包 rosidl_runtime_c
和 rosidl_runtime_cpp
。
目的是删除对生成器软件包的运行依赖,从而删除使用 Python 的代码生成工具。
在移动标头时,包含路径 / 命名空间会相应更新,因此在许多情况下,将包含指令从生成器软件包更改为运行时软件包就足够了。
生成的 C / C++ 代码也已重构。
以 __struct.h|hpp
、__functions.h
、__traits.hpp
等结尾的文件已移至子目录 detail
,但大多数代码仅包含以接口命名的标头,没有任何这些后缀。
一些与字符串和序列边界相关的类型也已重命名以匹配命名约定,但它们预计不会在用户代码中使用(在 RMW 实现和类型支持包之上)
有关更多信息,请参阅 `ros2/rosidl#446(适用于 C)<https://github.com/ros2/rosidl/issues/446>`_ 和 `ros2/rosidl#447(适用于 C++)<https://github.com/ros2/rosidl/issues/447>`_。
ament_add_test 的默认工作目录
使用“ament_add_test”添加的测试的默认工作目录已更改为“CMAKE_CURRENT_BINARY_DIR”,以匹配 CMake“add_test”的行为。
更新测试以使用新的默认值,或传递“WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}”以恢复以前的值。
默认控制台日志记录格式
默认控制台日志输出格式已更改为默认包含时间戳,请参阅:
默认控制台日志输出流
从 Foxy 开始,所有严重性级别的所有日志消息默认都会记录到 stderr。 这可确保日志消息立即发出,并使 ROS 2 日志系统与大多数其他日志系统保持一致。 可以通过 RCUTILS_LOGGING_USE_STDOUT 环境变量在运行时将流更改为 stdout,但所有日志消息仍将转到同一流。 有关更多详细信息,请参阅 https://github.com/ros2/rcutils/pull/196。
launch_ros
节点名称和命名空间参数已更改
与命名相关的 Node
操作参数已更改:
node_name
已重命名为name
node_namespace
已重命名为namespace
node_executable
已重命名为executable
已添加
exec_name
来命名与节点关联的进程。
以前,用户会使用 name
关键字参数。
旧参数已被弃用。
进行这些更改是为了让启动前端更加符合语言习惯。
例如,而不是
<node pkg="demo_nodes_cpp" exec="talker" node-name="foo" />
我们现在可以写
<node pkg="demo_nodes_cpp" exec="talker" name="foo" />
此更改也适用于“ComposableNodeContainer”、“ComposableNode”和“LifecycleNode”。 有关示例,请参阅“演示的相关更改。<https://github.com/ros2/demos/pull/431>”
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 取代。
demo_nodes_cpp
中的示例节点,即 talker_serialized_message
以及 listener_serialized_message
反映了这些变化。
Node 接口 getter 签名的重大变化
通过拉取请求 ros2/rclcpp#1069,节点接口 getter 的签名已被修改为返回节点接口的共享所有权(即 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 getter 签名中的重大更改
通过拉取请求 ros2/rclcpp#1119,发布者句柄 getter 的签名已被修改为返回底层 rcl 结构的共享所有权(即 std::shared_ptr
),而不是非拥有的原始指针。
在某些情况下,这对于修复段错误是必要的。
依赖于先前签名的下游包中所需的更改简单明了:使用 std::shared_ptr::get()
方法。
rclcpp_action
弃用 ClientGoalHandle::async_result()
使用此 API,可能会遇到竞争条件,导致抛出异常。
相反,最好使用更安全的 Client::async_get_result()
。
有关更多信息,请参阅 ros2/rclcpp#1120 和相关问题。
rclpy
支持多个参数集回调
使用``Node``方法``add_on_set_parameters_callback``和``remove_on_set_parameters_callback``来添加和删除在设置参数时调用的函数。
方法``set_parameters_callback``已被弃用。
相关拉取请求:https://github.com/ros2/rclpy/pull/457,https://github.com/ros2/rclpy/pull/504
rmw_connext_cpp
Connext 5.1 定位器种类兼容模式
直到“Eloquent”为止,“rmw_connext_cpp”将“dds.transport.use_510_compatible_locator_kinds”属性设置为“true”。 此属性不再被强制执行,并且“Foxy”和先前版本之间的共享传输通信将停止工作。 类似以下内容的日志:
PRESParticipant_checkTransportInfoMatching:Warning: discovered remote participant 'RTI Administration Console' using the 'shmem' transport with class ID 16777216.
This class ID does not match the class ID 2 of the same transport in the local participant 'talker'.
These two participants will not communicate over the 'shmem' transport.
Check the value of the property 'dds.transport.use_510_compatible_locator_kinds' in the local participant.
See https://community.rti.com/kb/what-causes-error-discovered-remote-participant for additional info.
当发生这种不兼容时,将会观察到。
如果需要兼容性,可以在包含以下内容的外部 QoS 配置文件中进行设置:
<participant_qos>
<property>
<value>
<element>
<name>
dds.transport.use_510_compatible_locator_kinds
</name>
<value>1</value>
</element>
</value>
</property>
</participant_qos>
请记住将“NDDS_QOS_PROFILES”环境变量设置为 QoS 配置文件路径。 有关更多信息,请参阅“Transport_Compatibility <https://community.rti.com/static/documentation/connext-dds/5.2.0/doc/manuals/connext_dds/html_files/RTI_ConnextDDS_CoreLibraries_ReleaseNotes/Content/ReleaseNotes/Transport_Compatibility.htm>”中的“如何更改 5.2.0 应用程序中的传输设置以与 5.1.0 兼容”部分。
rviz
工具使用 ROS 时间为消息添加时间戳
‘2D Pose Estimate’、’2D Nav Goal’ 和 ‘Publish Point’ 工具现在使用 ROS 时间而不是系统时间为消息添加时间戳,以便 use_sim_time
参数对它们产生影响。
std_msgs
消息弃用
尽管我们长期以来不鼓励这样做,但我们已正式弃用 std_msgs
中的以下消息。
example_interfaces 中有副本
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 参数“–enclave”设置节点区域名称,例如``ros2 run demo_nodes_py talker –ros-args –enclave /my_enclave``
相关设计文档:https://github.com/ros2/design/pull/274
请注意,权限文件受底层传输数据包大小限制,因此如果生成的权限文件超过 64kB,则将多个权限分组到同一个 enclave 下将**不起作用**。
相关问题 [ros2/sros2#228]
环境变量的重命名
Name in Eloquent |
Name in Foxy |
---|---|
ROS_SECURITY_ROOT_DIRECTORY |
ROS_SECURITY_KEYSTORE |
ROS_SECURITY_NODE_DIRECTORY |
ROS_SECURITY_ENCLAVE_OVERRIDE |
已知问题
[ros2/ros2#922] 对于使用 eProsima Fast-RTPS 或 ADLINK CycloneDDS 作为 RMW 实现的
rclcpp
节点,服务性能不稳定。
具体来说,服务客户端有时不会收到来自服务器的响应。
[ros2/rclcpp#1212] 就绪可重入 Waitable 对象可以尝试执行多次。
发布前的时间线
发布前的一些里程碑:
Note
由于冠状病毒大流行,以下日期延长了大约两周。
- Wed. April 22nd, 2020
API and feature freeze for
ros_core
[1] packages. Note that this includesrmw
, which is a recursive dependency ofros_core
. Only bug fix releases should be made after this point. New packages can be released independently.- Mon. April 29th, 2020 (beta)
Updated releases of
desktop
[2] packages available. Testing of the new features.- Wed. May 27th, 2020 (release candidate)
Updated releases of
desktop
[2] packages available.- Wed. June 3rd, 2020
Freeze rosdistro. No PRs for Foxy on the
rosdistro
repo will be merged (reopens after the release announcement).