ROS学习笔记

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流

->是指针指向其成员的运算符 .是结构体的成员运算符。最大的区别是->前面放的是指针,而.前面跟的是结构体变量

  1. 创建.msg和.srv两个文件,并写入对应内容
  2. CMakeLists.txt文件中find_package和依赖rosidl_generate_interfaces
  3. package.xml 文件补充依赖,tag普通依赖,<member_of_group>rosidl_interface_packages</member_of_group>依赖组依赖
  4. 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> 这个包可以在编译包时,编译其依赖。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值