Foxy Fitzroy (foxy
)
目录
Foxy Fitzroy 是 ROS 2 的第六个版本。
支持的平台
Foxy Fitzroy 主要支持以下平台:
一级平台:
Ubuntu 20.04(Focal):
amd64
和arm64
Mac macOS 10.14 (Mojave)
Windows 10(Visual Studio 2019)
Tier 3 平台:
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 上的 Foxy meta-ticket 包含进行中的高级任务的最新状态,以及涉及更多细节的特定票据的引用。
补丁发布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``。
相关票据:
Patch Release 7 变更(2022-02-08)
Launch 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 提交,并后来被回溯到Foxy中的 rmw_fastrtps#577。
Patch版本2的更改(2020-08-07)
static_transform_publisher中的错误
在Foxy的开发过程中,tf2_ros的static_transform_publisher程序引入了一个错误。传递给static_transform_publisher的欧拉角顺序的实现与文档不一致。Foxy的Patch版本2通过`修复 <https://github.com/ros2/geometry2/pull/296>`_ 顺序,使其与文档一致(偏航角、俯仰角、翻滚角)。对于已经开始使用初始版本或Patch版本1的用户,这意味着使用static_transform_publisher的任何启动文件都必须根据新的顺序交换命令行顺序。对于从ROS 2 Dashing、ROS 2 Eloquent或ROS 1迁移的用户,无需进行任何更改即可迁移到Foxy的Patch版本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 <https://github.com/ros2/ros2/issues/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 <https://github.com/ros2/rclcpp/pull/1047>`_,接收消息信息的回调函数的签名已经发生了变化。之前使用``rmw``类型的``rmw_message_info_t``,现在使用``rclcpp``类型的``rclcpp::MessageInfo``。所需的更改很简单,并且可以在以下拉取请求中看到示例:
序列化消息回调签名的更改
拉取请求 ros2/rclcpp#1081 引入了一种新的回调签名,用于检索序列化形式的ROS消息。先前使用的 C 结构体 rcl_serialized_message_t 被 C++ 数据类型 rclcpp::SerializedMessage 取代。
demo_nodes_cpp
中的示例节点,即 talker_serialized_message
和 listener_serialized_message
反映了这些更改。
节点接口获取器签名中的重大更改
通过拉取请求 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 getter 签名的破坏性更改
在拉取请求`ros2/rclcpp#1119 <https://github.com/ros2/rclcpp/pull/1119>`中,发布者句柄获取器的签名已修改为返回底层 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 中的 How to Change Transport Settings in 5.2.0 Applications for Compatibility with 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引入了安全"enclave"(飞地)的概念,其中"enclave"是一个进程或一组进程,它们将共享相同的身份和访问控制规则。
这意味着安全工件不再基于节点名称进行检索,而是基于安全飞地的名称进行检索。可以使用ROS参数``--enclave``来设置节点飞地名称,例如``ros2 run demo_nodes_py talker --ros-args --enclave /my_enclave``。
相关设计文档:https://github.com/ros2/design/pull/274
请注意,权限文件受底层传输数据包大小的限制,因此,如果生成的权限文件超过64kB,则无法将许多权限分组到同一个飞地中。相关问题`[ros2/sros2#228] <https://github.com/ros2/sros2/issues/228>`_
已知问题
[ros2/ros2#922] 使用 eProsima Fast-RTPS 或 ADLINK CycloneDDS 作为 RMW 实现的
rclcpp
节点的服务性能不稳定。具体而言,有时服务客户端无法接收到服务器的响应。[ros2/rclcpp#1212] 可重入的可等待对象可能会尝试执行多次。
发布前的时间线
发布前的一些关键节点:
注解
以下日期反映了由于冠状病毒大流行而延长的大约两周时间。
- 2020年4月22日,星期三
ros_core
1 包的 API 和功能冻结。请注意,这包括rmw
,它是ros_core
的递归依赖项。在此之后,只能进行错误修复发布。新的软件包可以独立发布。- 2020年4月29日,星期一(测试版)
已提供更新的``desktop`` [2]_软件包。测试新功能。
- 2020年5月27日(候选版本)
已提供更新的``desktop`` [2]_软件包。
- 2020年6月3日
冻结rosdistro。不会合并Foxy在`rosdistro`存储库上的PR(发布公告后重新开放)。
- 1
``ros_core``变体在`variants <https://github.com/ros2/variants>`_存储库中描述。
- 2(1,2)
在`变体<https://github.com/ros2/variants>`_存储库中描述的“desktop”变体。