参考引用
- 动手学 ROS2
网络传输可靠性对比
- ROS1 是基于 TCP/IP 构建的,TCP/IP 很难在无线通信中传输数据,因为中断可能会导致回退、重传和延迟
ROS2 中的 DDS 使用 UDP 传送数据,不会尝试重新传输数据,相反,DDS 决定在不可靠的条件下何时以及如何重新传输,DDS 引入了服务质量 (QoS) 来公开这些设置,以优化可用带宽和延迟
什么是 DDS?
- DDS(Data Distribution Service,数据分发服务),是 OMG(Object Management Group,对象管理组织)发布的分布式通信规范/协议,采用订阅发布模型,以中间件的形式提供通信服务,并提供 QoS(Quality of Service)策略,保障数据实时、高效、灵活的分发
- DDS 协议大致流程是多对多的单向数据交互,通信模型为分布式结构,没有中心节点,同一个数据空间任何两个节点之间都能直接通信,DDS 采用以数据为中心的发布-订阅模型 DCPS(Data-Centric Publish-Subscribe)
- 分布式实时通信-DDS 概述
wget http://fishros.com/install -O fishros && . fishros
sudo apt remove ros-galactic-*
sudo apt autoremove
cd /opt/ros/galactic(根据安装版本替换)/
ls
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
GUI 和 CLI
- GUI(Graphical User Interface,图形用户界面),Windows 是就是可视化的,通过鼠标点击按钮等图形化交互完成任务
- CLI(Command-Line Interface,命令行界面),终端(黑框框)就是命令行界面
什么是 API?
- API( Application Programming Interface,应用程序编程接口),比如你写了一个库,里面有很多函数,如果别人要使用这个库,但并不知道每个函数内部是怎么实现的。使用的人需要看你的文档或者注释才知道这个函数的入口参数和返回值或者这个函数是用来做什么的。对于使用者来说来说,你的这些函数就是 API
- API 在不同语言中的表现形式不同,在 C/C++ 表现为头文件,在 Python 中表现为 Python 文件
DDS 通信模型:可以定义话题的数据结构(类似于 ROS2 中的接口类型)
DDS 的应用层通过 DDS 进行数据订阅发布,DDS 通过传输层进行数据的收发
使用 DDS 的理由
- DDS 已经应用在军事、潜艇各个领域,稳定性、实时性经过实际检验
- 使用 DDS 需要维护的代码要少得多,可以让 ROS2 开发人员腾出手专注机器人开发
- DDS 有定义好的行为和规范并且有完善的文档
- DDS 提供了推荐的用例和软件 API,有较好的语言支持
mkdir -p d2lros2/chapt2/basic
code d2lros2
// 在 basic 目录下创建 first_ros2_node.cpp
#include "rclcpp/rclcpp.hpp"
#include <iostream>
int main(int argc, char **argv) {
// 调用 rclcpp 的初始化函数
rclcpp::init(argc, argv);
std::cout << "Hello World!" << std::endl;
// 调用 rclcpp 的循环运行创建的 first_node 节点
rclcpp::spin(std::make_shared<rclcpp::Node>("first_node"));
return 0;
}
# 在 basic 目录下创建
cmake_minimum_required(VERSION 3.16)
project(first_node)
find_package(rclcpp REQUIRED)
add_executable(first_node first_ros2_node.cpp)
target_link_libraries(first_node rclcpp::rclcpp)
cd ~/d2lros2/chapt2/basic
mkdir build
cd build
cmake ..
make
./first_node
Hello World!
<package>_DIR
CMAKE_PREFIX_PATH
CMAKE_FRAMEWORK_PATH
CMAKE_APPBUNDLE_PATH
PATH
echo $PATH
/opt/ros/galactic/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
<prefix>/(lib/<arch>|lib|share)/cmake/<name>*/ (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/ (U)
<prefix>/(lib/<arch>|lib|share)/<name>*/(cmake|CMake)/ (U)
ROS2 中每一个节点也是只负责一个单独的模块化的功能(比如一个节点负责控制车轮转动、一个节点负责从激光雷达获取数据、一个节点负责处理激光雷达的数据、一个节点负责定位等等)
ROS2 一共有四种通信方式实现节点之间的交互
ROS2 节点常用指令
# 启动功能包下的节点,格式:ros2 run <package_name> <executable_name>
ros2 run turtlesim turtlesim_node
# 查看节点列表
ros2 node list
# 查看节点信息
ros2 node info <node_name>
# 重映射节点名称
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle
# 运行节点时设置参数
ros2 run example_parameters_rclcpp parameters_basic --ros-args -p rcl_log_level:=10
一个工作空间下可以有多个功能包,一个功能包可以有多个节点存在
cd ~/d2lros2/chapt2/
mkdir -p chapt2_ws/src
sudo apt install ros-<version>-package_name
ros2 pkg create <package-name> --build-type {cmake,ament_cmake,ament_python} --dependencies <依赖名字>
ros2 pkg executables # 列出所有
ros2 pkg executables turtlesim # 列出 turtlesim 功能包的所有可执行文件
ros2 pkg list
# ros2 pkg prefix <package-name>
ros2 pkg prefix turtlesim
# 每个功能包都有一个标配的 l 文件,用于记录这个包的名字、构建工具、编译信息、拥有者和作用等信息
# 通过这个信息,就可以自动为该功能包安装依赖,构建时确定编译顺序等
ros2 pkg xml turtlesim
sudo apt-get install python3-colcon-common-extensions
cd ~/d2lros2/chapt2/
mkdir colcon_test_ws && cd colcon_test_ws
git clone https://github.com/ros2/examples src/examples -b galactic
colcon build
构建完成后,在 src 同级目录应该会看到 build、install 和 log 目录
- build 目录存储的是中间文件,对于每个包,将创建一个子文件夹,在其中调用例如CMake
- install 目录是每个软件包将安装到的位置,默认情况下,每个包都将安装到单独的子目录中
- log 目录包含有关每个 colcon 调用的各种日志信息
# 运行一个订者节点
cd ~/d2lros2/chapt2/colcon_test_ws
source install/setup.bash
ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
# 打开一个新的终端,先source,再运行一个发行者节点
source install/setup.bash
ros2 run examples_rclcpp_minimal_publisher publisher_member_function
# 只编译一个包
colcon build --packages-select YOUR_PKG_NAME
# 不编译测试单元
colcon build --packages-select YOUR_PKG_NAME --cmake-args -DBUILD_TESTING=0
# 运行编译的包的测试
colcon test
# 允许通过更改 src 下的部分文件来改变 install
colcon build --symlink-install
cd ~/d2lros2/chapt2/
mkdir -p chapt2_ws/src/
cd chapt2_ws/src
# pkg create 是创建包的意思
# --build-type 用来指定该包的编译类型,一共有三个可选项 ament_python、ament_cmake、cmake
# --dependencies 指的是这个功能包的依赖,这里是 ros2 的 C++ 客户端接口 rclcpp
ros2 pkg create example_cpp --build-type ament_cmake --dependencies rclcpp
tree # 查看 src 下的目录结构
.
└── example_cpp
├── CMakeLists.txt
├── include
│ └── example_cpp
├── package.xml
└── src
4 directories, 2 files
#include "rclcpp/rclcpp.hpp"
int main(int argc, char **argv) {
/* 初始化rclcpp */
rclcpp::init(argc, argv);
/*产生一个node_01的节点*/
auto node = std::make_shared<rclcpp::Node>("node_01");
// 打印一句自我介绍
RCLCPP_INFO(node->get_logger(), "node_01节点已经启动.");
/* 运行节点,并检测退出信号 Ctrl+C*/
rclcpp::spin(node);
/* 停止运行 */
rclcpp::shutdown();
return 0;
}
# 在 末尾添加下述代码
add_executable(node_01 src/node_01.cpp)
ament_target_dependencies(node_01 rclcpp)
install(TARGETS
node_01
DESTINATION lib/${PROJECT_NAME}
)
cd ~/d2lros2/chapt2/chapt2_ws
colcon build
source install/setup.bash
ros2 run example_cpp node_01
[INFO] [1711876723.907901312] [node_01]: node_01 start
ros2 node list # 当节点运行起来后,查看现有的节点
/node_01
计算机编程三种编程思想
- 面向过程编程思想。缩写:POP
- 面向对象编程思想。缩写:OOP
- 函数式思想。缩写:FP
用三种思想把大象装进冰箱
#include "rclcpp/rclcpp.hpp"
// 创建一个类节点,名字叫做Node03,继承自Node.
class Node03 : public rclcpp::Node {
public:
// 构造函数,有一个参数为节点名称
Node03(std::string name) : Node(name) {
// 打印一句
RCLCPP_INFO(this->get_logger(), "大家好,我是%s.",name.c_str());
}
private:
};
int main(int argc, char **argv) {
rclcpp::init(argc, argv);
/*产生一个node_03的节点*/
auto node = std::make_shared<Node03>("node_03");
/* 运行节点,并检测退出信号*/
rclcpp::spin(node);
rclcpp::shutdown();
return 0;
}
# 在 末尾添加下述代码
add_executable(node_02 src/node_02.cpp)
ament_target_dependencies(node_02 rclcpp)
install(TARGETS
node_02
DESTINATION lib/${PROJECT_NAME}
)
colcon build --packages-select example_cpp
source install/setup.bash
ros2 run example_cpp node_02
两者的区分点在于针对的对象不同,构建系统之针对一个单独的包进行构建,而构建工具重点在于按照依赖关系依次调用构建系统完成一系列功能包的构建
colcon 作为构建工具,通过调用 CMake、Python setuptools 等构建系统完成构建
常见构建系统
常见构建工具
--packages-select,仅生成单个包(或选定的包)
--packages-up-to,构建选定的包,包括其依赖项
--packages-above,整个工作区,然后对其中一个包进行了更改。此指令将重构此包以及(递归地)依赖于此包的所有包
–executor EXECUTOR
–parallel-workers NUMBER
本文发布于:2025-03-02 14:15:00,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/1740896106580832.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |