Ubuntu22.04 ----------Ros2 humble版本
初尝试
ros官方地址
使用apt下载ros2的包官网
安装rqt-robot-steering包的命令sudo apt install ros-humble-rqt-robot-steering
运行节点ros2 run rqt_robot_steering rqt_robot_steering
运行小乌龟ros2 run turtlesim turtlesim_node
控制小乌龟运动。在/cmd_vel前添加turtle1。
挪动滑杆,调整前进转弯速度,小乌龟移动。
ros2包wpr_simulation2(github上下载):
wpr_simulation2目录文件中的scripts目录用于放置脚本文件和Python程序。(.sh)属于依赖包。
终端运行humble版本的依赖install_for_humble.sh。
成功后进入工作空间入口catkin_ws(包wpr_simulation2的父亲目录)
终端中输入colcon build
进行编译,colcon build
运行在catkin_ws文件夹下
终端中输入source ~/catkin_ws/install/setup.bash
载入工作空间的环境设置
终端中输入ros2 launch wpr_simulation2 wpb_simple.launch.py
运行编译好的ros程序
使用rqt_robot_steering控制此机器人,如下图
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
启用一个更改名称的节点,其特性与原节点相同,属于映射。
ros2 node list
用来查看现在运行的节点
rqt_graph
可以打开rqt_graph 也可以在rqt Plugins > Introspection > Node Graph
.中打开
ros2 topic list
查看话题。加上-t
返回可以加上消息类型
ros2 topic echo <topic_name>
查看话题中的内容
ros2 topic info /turtle1/cmd_vel
可以查看话题订阅者与发布者的数量
ros2 interface show geometry_msgs/msg/Twist
查看消息类型的具体数据结构
ros2 topic pub <topic_name> <msg_type> '<args>'
从命令行将数据发布到指定主题中
示例
ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
--once
表示执行一次并退出
--rate 1
表示以1Hz频率稳定发布。简写版: -r 1
默认情况下是rate
ros2 topic hz
ros2 topic hz /turtle1/pose
服务
服务是 ROS 图中节点通信的另一种方法。服务基于调用和响应模型,而不是主题的发布者-订阅者模型。虽然主题允许节点订阅数据流并获取持续更新,但服务仅在客户端专门调用时才提供数据。
服务列表ros2 service list
就是每个app(node)的功能列表,ros2 service list -t
能够返回类型内容。
服务拥有其数据结构类型,比如请求、响应类型两种,并不是完全一样的。
找出服务的类型ros2 service type <service_name>
输入ros2 service type /clear
返回std_srvs/srv/Empty
可以根据类型寻找服务ros2 service find <type_name>
,可以返回所有此类型的服务。
为了调用服务,先了解下输入参数的结构:
在 /clear 服务的类型 Empty 上尝试此操作ros2 interface show std_srvs/srv/Empty
,Empty 类型不会发送或接收任何数据。所以,自然地,它的结构是空白的。
从ros2 service list -t
的结果来看,/spawn
的类型是turtlesim/srv/Spawn
。查看/spawn
服务的请求和响应参数,ros2 interface show turtlesim/srv/Spawn
,返回内容---
行上方的信息告诉我们调用 /spawn 所需的参数。 x、y 和 theta 确定生成的海龟的 2D 姿态,并且名称显然是可选的。在这种情况下,您不需要了解该---
行下方的信息,但它可以帮助您了解从调用中获得的响应的数据类型。
调用服务
ros2 service call <service_name> <service_type> <arguments>
。<arguments>
部分是可选的。
ros2 service call /clear std_srvs/srv/Empty
将清除小乌龟视图中的任何线条。
通过调用 /spawn
并设置参数来生成一只新海龟。从命令行调用服务时输入的 <arguments>
需要采用 YAML
语法。
ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
如此便生成一直新乌龟。
问题:如何生成控制节点,难道只能再映射?
问题:ros2如何结束节点 ros2的 call /kill 如何使用? 只有小乌龟有/Kill服务
参数
参数是节点的配置值。您可以将参数视为节点设置。节点可以将参数存储为整数、浮点数、布尔值、字符串和列表。在ROS 2中,每个节点维护自己的参数。
ros2 param list
ros2 param get <node_name> <parameter_name>
确定参数的类型 ros2 param get /turtlesim background_g
ros2 param set <node_name> <parameter_name> <value>
返回 Set parameter successful
查看节点当前的所有参数值 ros2 param dump <node_name>
,要将 /turtlesim
参数的当前配置保存到文件turtlesim.yaml
中,请输入命令:
ros2 param dump /turtlesim > turtlesim.yaml
如果您想将来使用相同的参数重新加载节点,输入此命令ros2 param load /turtlesim turtlesim.yaml
ros2 param load <node_name> <parameter_file>
,转储参数会派上用场。
节点启动时,加载参数文件ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
例如ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml
Action动作
动作是 ROS 2 中的通信类型之一,适用于长时间运行的任务。它们由三部分组成:目标、反馈和结果。
ros2 node info /turtlesim
用于获取节点信息
操作有类型,类似于主题和服务。要查找 /turtle1/rotate_absolute 的类型
ros2 action list
识别 ROS 图中的所有操作
ros2 action list -t
要查找 /turtle1/rotate_absolute action的类型
ros2 action info /turtle1/rotate_absolute
进一步查看action
返回
Action: /turtle1/rotate_absolute
Action clients: 1
/teleop_turtle
Action servers: 1
/turtlesim
ros2 interface show turtlesim/action/RotateAbsolute
查看 action 的类型结构,ros2 interface show **
可以查看任何形式的类型的结构
# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
该消息的第一部分上方 ---
是目标请求的结构(数据类型和名称)。下一部分是结果的结构。最后一部分是反馈的结构。
ros2 action send_goal <action_name> <action_type> <values>
通过这个命令,我们可以发送action控制小乌龟旋转
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
--feedback
可以实时查看反馈,直到看到成功。
rqt_console
rqt_console 是一个 GUI 工具,用于在 ROS 2 中内省日志消息。通常,日志消息显示在您的终端中。使用 rqt_console,您可以随着时间的推移收集这些消息,以更有条理的方式仔细查看它们,过滤它们,保存它们,甚至重新加载保存的文件以在不同时间进行内省。
节点使用日志以多种方式输出有关事件和状态的消息。为了用户的利益,它们的内容通常是信息性的。
记录器级别
Fatal
Error
Warn
Info
Debug
设置默认记录器级别,这样你就看不到Info级别的内容。
ros2 run turtlesim turtlesim_node --ros-args --log-level WARN
同时启动多个节点
ros2 launch turtlesim multisim.launch.py
启动多个节点的命令
话题 pose 是实时运行中的。
bag
ros2 bag record <topic_name>
录制话题 录制文件保存在运行的根目录下
ros2 bag record -o subset /turtle1/cmd_vel /turtle1/pose
可以同时录制多个话题,-o
选项允许您为包文件选择唯一的名称,保存录制是文件名为subset
,。
ros2 bag info <bag_file_name>
查看录制的话题的包的详细信息
ros2 bag play subset
播放录制的话题,重新进行一遍录制的话题。/turtle1/pose话题的发送频率非常高。
colcon构建
Linux下mkdir提供了强大的“-p”选项,只要一条命令mkdir -p ~/ros2_ws/src
就能自动创建需要的上级目录。
git clone https://github.com/ros/ros_tutorials.git -b humble
-b 选项根据ros2版本选定分支
用git克隆下来包,用下面的命令进行编译
colcon build --symlink-install
查看编译情况
colcon test
个人工作空间的环境变量
source install/setup.bash
设置colcon_cd命令
colcon_cd 命令允许您快速将 shell 的当前工作目录更改为包的目录。例如,colcon_cd some_ros_package
会快速将您带到目录 ~/ros2_ws/src/some_ros_package
。
source /usr/share/colcon_cd/function/colcon_cd.sh
export _colcon_cd_root=/opt/ros/humble/
ros2 pkg create
创建自己的包
touch COLCON_IGNORE
可以创建一个不执行构建的文件,colcon build 时,将不会构建此包
想从包中运行单个特定测试
colcon test --packages-select YOUR_PKG_NAME --ctest-args -R YOUR_TEST_IN_PKG
工作空间安装依赖-依赖项
rosdep install -i --from-path src --rosdistro humble -y
rosdep init
失败解决办法:
sudo gedit /etc/hosts
文件中写入并保存
185.199.108.133 raw.githubusercontent.com
从新运行rosdep init即可
运行colcon build
成功!
install
目录是工作区设置文件所在的位置,您可以使用它来获取覆盖层。
source install/local_setup.bash
可以在ROS2底层之上将其覆盖。
工作空间覆盖
通过编辑turtlesim窗口上的标题栏来修改覆盖层中的turtlesim。为此,请在 ~/ros2_ws/src/ros_tutorials/turtlesim/src 中找到turtle_frame.cpp 文件。
覆盖层被添加到路径前面,并且优先于底层,正如您在修改后的turtlesim中看到的那样。建议在处理少量包时使用覆盖,这样您就不必将所有内容都放在同一个工作区中,并在每次迭代时重建一个巨大的工作区。
在colcon构建编译时候,需要ros2底层的工作空间(环境变量),否则报错。
创建包
包是 ROS 2 代码的组织单位。如果您希望能够安装您的代码或与其他人共享它,那么您需要将其组织在一个包中。通过包,您可以发布您的 ROS 2 作品并允许其他人轻松构建和使用它。ROS 2 中的包创建使用 ament 作为其构建系统,并使用 colcon 作为其构建工具。您可以使用官方支持的 CMake 或 Python 创建包,但也存在其他构建类型。
在 ROS 2 中创建新包的命令语法是:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>
创建包
使用可选参数 --node-name,它在包中创建一个简单的 Hello World 类型可执行文件。
ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package
colcon build --packages-select my_package
选择包进行构建,如果包很多,重新构建需要很多时间。
描述和许可证字段包含 TODO 注释。这是因为包描述和许可证声明不会自动设置,但如果您想要发布包,则需要它们。维护者字段可能还需要填写。
从 ros2_ws/src/my_package,使用文本编辑器打开 package.xml。更改描述内容。
每次运行节点前记得用本地自己的工作空间覆盖一下ros2自带的工作空间:source install/local_setup.bash
使用包、节点:ros2 run my_package my_node
简单发布者与订阅者
ros2_ws/src/cpp_pubsub/src
。回想一下,这是任何 CMake 包中包含可执行文件的源文件所属的目录。
输入以下命令来下载示例 talker 代码:
wget -O publisher_member_function.cpp https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_publisher/member_function.cpp
下载的文件说明:
- 标准 C++ 头文件之后是 rclcpp/rclcpp.hpp,它允许您使用 ROS 2 系统最常见的部分。最后是std_msgs/msg/string.hpp,其中包括将用于发布数据的内置消息类型。这些线代表节点的依赖关系。
- 公共构造函数将节点命名为minimal_publisher,并将count_初始化为0。在构造函数内,发布者使用String消息类型、主题名称topic以及备份时限制消息所需的队列大小进行初始化。接下来,timer_被初始化,这导致timer_callback函数每秒执行两次。
- timer_callback函数是设置消息数据和实际发布消息的地方。 RCLCPP_INFO 宏确保每条发布的消息都打印到控制台。
- 最后是计时器、发布者和计数器字段的声明。 MinimalPublisher 类之后是 main,节点实际执行的地方。
- rclcpp::init 初始化 ROS 2,rclcpp::spin 开始处理来自节点的数据,包括来自计时器的回调。
- 在ament_cmake buildtool 依赖项后添加新行,补充依赖。
c++
<depend>rclcpp</depend>
<depend>std_msgs</depend>
python
<exec_depend>rclpy</exec_depend>
<exec_depend>std_msgs</exec_depend>
- 现在打开 CMakeLists.txt 文件。在现有依赖项 find_package(ament_cmake REQUIRED)
下方,添加以下行:
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
- 此时可以构建发布者节点,也可以继续先行把订阅者准备充足,,,话题名称就是
topic
,我认为可以更改。 wget -O subscriber_member_function.cpp https://raw.githubusercontent.com/ros2/examples/humble/rclcpp/topics/minimal_subscriber/member_function.cpp
下载订阅者节点- 重新打开 CMakeLists.txt 并在发布者条目下方添加订阅者节点的可执行文件和目标。
python版本补充
self.create_publisher(String, 'topic', 10)
中的10。
队列大小是必需的 QoS(服务质量)设置,它限制如果订阅者接收消息的速度不够快,则排队消息的数量。
添加入口点
打开 setup.py 文件。再次将维护者、维护者电子邮件、描述和许可证字段与您的 package.xml 相匹配:添加talker = py_pubsub.publisher_member_function:main
entry_points={
‘console_scripts’: [
‘talker = py_pubsub.publisher_member_function:main’,
],
},
发布者
wget https://raw.githubusercontent.com/ros2/examples/humble/rclpy/topics/minimal_publisher/examples_rclpy_minimal_publisher/publisher_member_function.py
订阅者
wget https://raw.githubusercontent.com/ros2/examples/humble/rclpy/topics/minimal_subscriber/examples_rclpy_minimal_subscriber/subscriber_member_function.py
客户端服务端通信
ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_srvcli --dependencies rclcpp example_interfaces
–dependencies 参数会自动将必要的依赖行添加到 package.xml 和 CMakeLists.txt 中。 example_interfaces 是包含构建请求和响应所需的 .srv 文件的包:
增加可执行文件在CMakeLists.txt :
add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server rclcpp example_interfaces)
install(TARGETS
server
DESTINATION lib/${PROJECT_NAME})
python版本
MinimalClientAsync 类构造函数使用名称minimal_client_async 初始化节点。构造函数定义创建一个与服务节点具有相同类型和名称的客户端。类型和名称必须匹配,客户端和服务才能进行通信。构造函数中的 while 循环每秒检查一次与客户端的类型和名称匹配的服务是否可用。最后它创建一个新的 AddTwoInts 请求对象。
定义自定义接口文件
.msg文件 代码生命数据结构
.srv文件 请求与响应的数据结构
<build_depend>***</build_depend>
是在创建功能包时添加进来的依赖
<exec_depend>***</exec_depend>
中间的内容与build是一样的,为的是功能包在创建和执行时都可以用到依赖
RCLCPP_INFO_STREAM
输出形式改为IO流
->
是指针指向其成员的运算符 .
是结构体的成员运算符。最大的区别是->
前面放的是指针,而.
前面跟的是结构体变量
- 创建.msg和.srv两个文件,并写入对应内容
- CMakeLists.txt文件中find_package和依赖rosidl_generate_interfaces
- package.xml 文件补充依赖,tag普通依赖,
<member_of_group>rosidl_interface_packages</member_of_group>
依赖组依赖 - colcon build 即可
构建的接口,可以用于topic也可用于client-service。
使用本包里面的接口,就需要在CmakeLists.txt添加:
rosidl_get_typesupport_target(cpp_typesupport_target
${PROJECT_NAME} rosidl_typesupport_cpp)
target_link_libraries(publish_address_book "${cpp_typesupport_target}")
ROS2实现colcon build编译某个包及其依赖
colcon build --packages-up-to <name-of-pkg>
这个包可以在编译包时,编译其依赖。