ROS2基础编程

本文主要介绍如何使用ROS2。基于ROS2 Humble版本,介绍如何在Ubuntu22下安装和使用ROS2和ROS2的开发工具.
更多内容,访问专栏目录获取实时更新。

在Ubuntu中安装ROS2和开发工具

当前作者的Ubuntu版本:
在这里插入图片描述
在安装ROS前推荐先安装一些依赖工具:

  • Terminator: 可以帮助开发者更方便的操作多个命令行
  • Visual Studio Code: 开发IDE
  • Gedit: 文本编辑工具
sudo apt install terminator
sudo apt install gedit

安装ROS则推荐参考官方文档,ROS2 Humble Installation Wiki
或者执行:

sudo apt install ros-humble-desktop 

安装完成之后,可以分别在两个命令行运行talker和listener程序,检查已经成功完成了安装:

ros2 run demo_nodes_cpp talker
ros2 run demo_nodes_cpp listener

在这里插入图片描述
在每次启动一个新的命令行工具时,我们都需要执行:

source /opt/ros/humble/setup.bash

(不同的ROS版本路径基本一致,如foxy版本的路径为/opt/ros/foxy/setup.bash)

为了后期使用方便,这里建议将该指令加入到.bashrc文件中

gedit ~/.bashrc  # 编辑.bashrc文件
# 在最后一行添加
source /opt/ros/humble/setup.bash

下一步则是安装ROS2的编译工具colcon,参考ROS Wiki

colcon是一个命令行工具,用于改进构建、测试和使用多个软件包的工作流程

sudo apt install python3-colcon-common-extensions

安装完成后我们需要启动colcon的自动补全配置:

cd /usr/share/colcon_argcomplete/hook/
ls  # 找到配置文件的位置

在这里插入图片描述

将下面的指令加入到.bashrc文件的最后:

source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash 

创建Workspace和Package

Workspace是一个包含了多个Package的文件夹,在使用ROS之前,建议先在命令行里source你的工作空间从而获取相应的工作包。

创建工作空间:

mkdir ros2_ws
cd ros2_ws
mkdir src
colcon build
ls

上述的指令是在根目录下创建了一个文件夹ros2_ws,然后在ros2_ws目录下创建了一个src文件夹,然后执行colcon build将当前的文件夹初始化为一个工作空间,最后你将在该目录下发现新生成了install, build和log三个新的文件夹。

为了能够获取到当前工作空间里的全部工作包,我们source该工作空间里install/setup.bash文件到.bashrc

source ~/ros2_ws/install/setup.bash

创建Python工作包:

cd ~/ros2_ws/src
ros2 pkg create my_py_pkg --build-type ament_python --dependencies rclpy

这里我们在ros2_ws/src文件夹下创建了一个名为my_py_pkg的工作包,并为它设置了编译类型和工作包依赖。

然后返回到ros2_ws目录下执行colcon build编译该工作包。
在这里插入图片描述
当你在工作空间里有很多工作包时,可以指定编译某个工作包来节省时间:

colcon build --package-select my_py_pkg

创建C++工作包:

cd ~/ros2_ws/src
ros2 pkg create my_cpp_pkg --build-type ament_cmake --dependencies rclcpp

回到ros2_ws目录下执行colcon build
在这里插入图片描述

ROS2 Node

Node(节点)是ROS包(应用程序)中的一个子程序,它使用ROS的客户端库和其他节点进行通信,Node能够发布或订阅主题,以及提供或使用服务,是ROS中最基本的通信方式。

创建Python节点

在’my_py_pkg’工作包下创建节点文件:
在这里插入图片描述
my_first_node.py

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node

def main(args=None):
  rclpy.init(args=args)  # initialize ROS communication

  node = Node("py_test")  # create a Node named py_test
  node.get_logger().info("Hello ROS2")  # let the node print something
  rclpy.spin(node)  # execute the program and block it

  rclpy.shutdown()  # shutdown communication

if __name__ == "__main__":
  main()

创建完Node文件后,我们更新setup.py文件,将该节点加入到工作包中:
在这里插入图片描述
这里我们给节点赋了别名first_py_node,在使用它时就可以调用这个名字,=后面则是节点文件的路径和将要执行的函数名

然后回到Workspace目录(ros2_ws)下执行colcon build,并执行source ~/.bashrc。(再次确认你已经在该文件中加入了source ~/ros2_ws/install/setup.bash)

启动我们新创建的Python节点:
在这里插入图片描述
优化Python节点

my_first_node.py

#!/usr/bin/env python3
import rclpy
from rclpy.node import Node


class MyNode(Node):

  def __init__(self):
    super().__init__("py_test")  # create a Node named py_test
    self.get_logger().info("Hello ROS2")  # let the node print something
    self.counter = 0
    self.create_timer(1, self.timer_callback)  # call timer_callback() every 1 second

  def timer_callback(self):
    self.counter += 1
    self.get_logger().info("Hello" + str(self.counter))

def main(args=None):
  rclpy.init(args=args)  # initialize ROS communication

  node = MyNode()
  rclpy.spin(node)  # execute the program and block it

  rclpy.shutdown()  # shutdown communication

if __name__ == "__main__":
  main()

创建C++节点

创建C++文件

cd ~/ros2_ws/src/my_cpp_pkg/src
touch my_first_node.cpp

如果我们直接开始引用头文件,会提示引用路径错误,这里需要更改引用路径
在这里插入图片描述
在VS Code中同时按下Ctrl+Shift+P,
在这里插入图片描述
会自动生成c_cpp_properties.json文件,更改其中的includePath:
在这里插入图片描述
my_first_node.cpp

#include "rclcpp/rclcpp.hpp"

int main(int argc, char **argv)
{
  rclcpp::init(argc, argv);
  auto node = std::make_shared<rclcpp::Node>("cpp_test");  // create a shared pointer for node named cpp_test
  RCLCPP_INFO(node->get_logger(), "Hello CPP node");  // node print Hello content
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

然后更新CMakeLists.txt
在这里插入图片描述
之后执行编译并运行:
在这里插入图片描述
优化C++节点

my_first_node.cpp

#include "rclcpp/rclcpp.hpp"

class MyNode: public rclcpp::Node
{
public:
  MyNode(): Node("cpp_test"), counter(0)
  {
    RCLCPP_INFO(this->get_logger(), "Hello CPP node");  // node print Hello content

    timer = this->create_wall_timer(
      std::chrono::seconds(1), 
      std::bind(&MyNode::timerCallback, this)
    );
  }

private:
  void timerCallback()
  {
    counter++;
    RCLCPP_INFO(this->get_logger(), "Hello %d", counter);
  }

  rclcpp::TimerBase::SharedPtr timer;
  int counter;
};

int main(int argc, char **argv)
{
  rclcpp::init(argc, argv);
  auto node = std::make_shared<MyNode>();
  rclcpp::spin(node);
  rclcpp::shutdown();
  return 0;
}

ROS2 库
rcl - ros client library,包含了ROS开发过程中各种编程语言的依赖包,如:

  • rclcpp
  • rclpy
  • rclnodejs
  • rcljava
  • rcl…

ROS工具

重命名节点

在运行多个相同节点时,我们会希望给Node起一个独特的名字用于区分,否则将会出现下面的问题:
在这里插入图片描述
在左侧两个命令行里启动了相同的Node,使用ros2 node list查看当前节点列表时,可以看到提示有同名的节点,这也不利于后面节点间建立通信。

在启动节点时,可以添加参数做重映射,从而不需要在程序中做任何改动:

ros2 run <package_name> <node_name> --ros-args --remap __node:=<new_node_name>

在这里插入图片描述

Colcon

colcon是文章中我们一直在使用的编译工具,但是每次修改了文件之后,如果不执行colcon build,修改是不会生效的。但是如果我们执行下面的指令,将会解决这个问题,从而避免经常编译:

colcon build --packages-select my_py_pkg --symlink-install

rqt_graph

分别在两个命令行中启动节点:

ros2 run demo_nodes_py talker
ros2 run demo_nodes_py listener

在另一个命令行中执行rqt_graph,可以看到如下的界面,以图形话的方式显示节点间的联系:
在这里插入图片描述

Tutlesim

安装turtlesim包:

sudo apt install ros-humble-turtlesim
source ~/.bashrc

运行:

ros2 run turtlesim turtlesim_node

将会打开一个2D可视化界面:
在这里插入图片描述
使用下面的命令运行turtle的控制节点:

ros2 run turtlesim turtle_teleop_key
如有错误,欢迎留言或来信指正:hbin6358@163.com
ROS2编程基础课程文档 ROS 2(机器人操作系统2)是用于机器人应用的开源开发套件。ROS 2之目的是为各行各业的开发人员提供标准的软件平台,从研究和原型设计再到部署和生产。 ROS 2建立在ROS 1的成功基础之上,ROS 1目前已在世界各地的无数机器人应用中得到应用。 特色 缩短上市时间 ROS 2提供了开发应用程序所需的机器人工具,库和功能,可以将时间花在对业务非常重要的工作上。因为它 是开源的,所以可以灵活地决定在何处以及如何使用ROS 2,以及根据实际的需求自由定制,使用ROS 2 可以大幅度提升产品和算法研发速度! 专为生产而设计 凭借在建立ROS 1作为机器人研发的事实上的全球标准方面的十年经验,ROS 2从一开始就被建立在工业级 基础上并可用于生产,包括高可靠性和安全关键系统。 ROS 2的设计选择、开发实践和项目管理基于行业利 益相关者的要求。 多平台支持 ROS 2在Linux,Windows和macOS上得到支持和测试,允许无缝开发和部署机器人自动化,后端管理和 用户界面。分层支持模型允许端口到新平台,例如实时和嵌入式操作系统,以便在获得兴趣和投资时引入和推 广。 丰富的应用领域 与之前的ROS 1一样,ROS 2可用于各种机器人应用,从室内到室外、从家庭到汽车、水下到太空、从消费 到工业。 没有供应商锁定 ROS 2建立在一个抽象层上,使机器人库和应用程序与通信技术隔离开来。抽象底层是通信代码的多种实现, 包括开源和专有解决方案。在抽象顶层,核心库和用户应用程序是可移植的。 建立在开放标准之上 ROS 2中的默认通信方法使用IDL、DDS和DDS-I RTPS等行业标准,这些标准已广泛应用于从工厂到航空 航天的各种工业应用中。 开源许可证 ROS 2代码在Apache 2.0许可下获得许可,在3条款(或“新”)BSD许可下使用移植的ROS 1代码。这两个 许可证允许允许使用软件,而不会影响用户的知识产权。 全球社区 超过10年的ROS项目通过发展一个由数十万开发人员和用户组成的全球社区,为机器人技术创建了一个庞大 的生态系统,他们为这些软件做出贡献并进行了改进。 ROS 2由该社区开发并为该社区开发,他们将成为未 来的管理者。 行业支持 正如ROS 2技术指导委员会成员所证明的那样,对ROS 2的行业支持很强。除了开发顶级产品外,来自世界 各地的大大小小公司都在投入资源为ROS 2做出开源贡献。 与ROS1的互操作性 ROS 2包括到ROS 1的桥接器,处理两个系统之间的双向通信。如果有一个现有的ROS 1应用程序, 可 以通过桥接器开始尝试使用ROS 2,并根据要求和可用资源逐步移植应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值