2021-09-02 ROS2安装整理

参考链接

https://blog.csdn.net/qq_44717317/article/details/104547474
https://www.guyuehome.com/blog/index/category/14
https://www.guyuehome.com/10721
http://docs.ros.org/en/foxy/Tutorials/Launch-Files/Creating-Launch-Files.html
http://docs.ros.org/en/foxy/Tutorials/Launch-Files/Creating-Launch-Files.html
https://www.zhihu.com/column/c_1348897856313581568

安装

设置编码
sudo locale-gen en_US en_US.UTF-8

sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

export LANG=en_US.UTF-8

设置软件源
sudo apt update && sudo apt install curl gnupg2 lsb-releasecurl -s

https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add -

sudo sh -c ‘echo “deb [arch=$(dpkg --print-architecture)] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main” > /etc/apt/sources.list.d/ros2-latest.list’

安装ROS2
sudo apt update

sudo apt install ros-foxy-desktop

设置环境,在 .bashrc文件最后面加入,主目录中ctrl+h可以查看隐藏文件
source /opt/ros/foxy/setup.bash

安装自动补全工具
sudo apt install python3-argcomplete

验证安装
第一个终端先运行一个talker:
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_cpp talker

第二个终端,运行一个Listener:
source /opt/ros/foxy/setup.bash
ros2 run demo_nodes_py listener

ROS2的目的

支持多机器人系统
支持实时控制
铲除原型与产品之间的鸿沟
支持微控制器
跨系统平台支持

ROS2常用指令和概念

ros2常用指令(运行程序查看程序是否正常)
ros2 run <package_name> <executable_name> 运行一个功能包内的可执行程序

ros2 node list 查看当前ros2中有哪些节点存在,加上 -t 后缀,可以看到指定话题的发布者与订阅者的数量

ros2 node info node_name 查看指定节点的信息

ros2 topic list 查看当前ros2中有哪些话题存在,加上 -t 后缀,可以看到话题传输的信息格式

ros2 topic echo <topic_name> 查看指定话题发布的数据

ros2 service list 查看当前ros2中有哪些服务存在

ros2 action list 查看当前ros2中有哪些action存在

ros2 pkg executables package_name 查找一个功能包内有哪些可执行的程序(可以知道编译是否生成对应可执行的文件)

ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel 使用同一个可执行程序修改成不同的发布话题(例如turtle1的控制器节点,通过下面的命令变成了turtle2的控制器,而且turtle2控制节点与turtle1控制节点不同,两者可以共存)

ros2 topic pub <topic_name> <msg_type> ‘’ 往指定话题中发布数据
示例ros2 topic pub --rate 1 /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}}”
缺点,引号内的命令不能用TAB补全,且对格式有严格输入要求,可以使用rqt工具,更方便发布多种数据

ros2 topic hz (查看话题发布的频率)

节点 (Node)
一个完整的机器人系统,由许多的节点组成。每个节点都负责一个模块的功能。节点之间互相配合使得系统实现某些更为高级的功能。
在ROS2中,每一个可执行程序(C++、Python)可以包含1个或者多个节点,这是与ROS1中不同的,ros1每一个执行程序生成一个节点。
例如,一个基于ROS的轮式移动机器人,节点 /sensor 负责采集周围环境信息,节点 /controler 负责判断障碍物信息,节点 /motion 负责改变车轮的转速和转向,三者配合实现避障的功能,其中三者之间的数据交互可以通过topic、service等实现。

重映射(Remapping)
重映射机制可以帮我们重定义节点名称、话题名名称、服务名称等。
示例1,修改turtle仿真程序的节点命,打开第二个仿真,这里的my_turtle为更改后的节点名。
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtle

话题 (Topic)
节点之间则是通过一个至关重要的通道完成数据交换的,这个通道就是“话题”。
一个节点可以通过多个话题向外发布数据,也可以同时订阅多个其他节点发布的话题,相当于话题是一个多对多的订阅/发布模型。

服务 (Server)
基于订阅/发布机制的,无论有没有订阅者,发布者都会周期发布数据,这种模式适合持续数据的收发,比如传感器数据。机器人系统中还有另外一些配置性质的数据,并不需要周期处理,此时就要用到另外一种ROS通信方式——服务(Service)。 服务是基于客户端/服务器模型的通信机制,服务器端只在接收到客户端请求时才会提供反馈数据。

ros2 service list 查看当前系统中有那些服务

ros2 service list -t 查看当前系统中有那些服务及对用的数据结构

ros2 service type <service_name> 查看指定服务的数据结构示例

ros2 service type /clear ros2 service find <type_name> 查找提供某类型数据的所有服务,及这种数据格式有多少种服务使用

示例
ros2 service find std_srvs/srv/Empty重点 查看数据类型的具体结构

ros2 service show <type_name>.srv
示例 ros2 service show std_srvs/srv/Empty.srv

ros2 service show turtlesim/srv/Spawn.srv重点 发送服务请求

ros2 service call <service_name> <service_type> 示例

ros2 service call /clear std_srvs/srv/Empty作用清除当前仿真中乌龟移动的轨迹

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ‘’}"在2,2 生成一个角度0.2的新乌龟

参数 (Param)
参数也是ROS2中很重要的一个概念,主要作用是对节点功能的配置,在ROS2中,每个节点都有自己的参数,这些参数可以用整型数、浮点数、布尔型数、字符串和列表来描述。

ros2 param list 查看当前系统中有那些参数定义(以每个节点名为命名空间,每个节点都有一些参数)

ros2 param get <node_name> <parameter_name> 获取指定参数的具体值示例

ros2 param get /turtlesim background_g ros2 param set <node_name> <parameter_name> 设置指定参数(这种修改只能生效在当前,重新运行后会重置,若需要永久生效,须使用保存参数命令和加载参数文件命令)示例

ros2 param set /turtlesim background_r 150 ros2 param dump <node_name> (foxy版ros2没有这个功能)保存指定节点的所有参数设置到文件中,保存文件的路径为当前终端的路径示例

ros2 param dump /turtlesim加载参数文件

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中最重要的两种底层通信机制,但也并不是说能解决所有应用层的问题,举一个例子,如果要让机械臂抓取一个物体,我们不仅要发出指令,还需要获取机械臂的实时反馈,如果直接用话题和服务也可以实现,不过一下得上好几个,有点麻烦。 所以针对类似的场景,ROS推出了一个应用级的通信机制——动作(action),主要结局需要运行一段时间的机器人任务。action也并不是一个全新的机制,而是由底层的三个话题和服务组成:一个任务目标(Goal,服务),一个执行结果(Result,服务),周期数据反馈(Feedback,话题)。 action是可抢占式的,由于需要执行一段时间,比如执行过程中你不想跑了,那可以随时发送取消指令,动作终止,如果执行过程中发送一个新的action目标,则会直接中断上一个目标开始执行最新的任务目标。 总体上来讲,action是一个客户端/服务器的通信模型,客户端发送一个任务目标,服务器端根据收到的目标执行并周期反馈状态,执行完成后反馈一个执行结果。

ros2 node info /turtlesim 查看信息节点所有订阅发布及服务,包含action的信息

ros2 action list 查看当前有那些acton

ros2 action list -t 查看当前有那些acton以及对应的数据类型

ros2 action info /turtle1/rotate_absolute 查看指定aciton的信息,名称、客户端数量及对应名称、服务端数量及对应名称查看action的数据类型具体结构与查看话题与服务的数类型一样。

示例
ros2 action show turtlesim/action/RotateAbsolute.action有点像service的数据结构,只不过有两个“—”将数据分成了三段,第一段描述客户端发送的请求目标,第二段描述的是action执行完成后的反馈结果,第三段描述的是action执行过程中的周期反馈。
ros2 action send_goal <action_name> <action_type> 命令行发送action目标

示例
ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"需要显示回馈信息,在命令最后加上–feedback,显示周期性的反馈数据ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute “{theta: -1.57}” --feedback

ROS2常用工具

rqt_graph工具
ros2自带的可以查看整个系统中节点以及话题的连接状态。

ros2日志管理工具命令
ros2 run rqt_console rqt_console
ROS2中的日志分成五个级别,级别自高到低分别是:
Fatal:致命级,描述系统为了自我保护即将终止的消息
Error:错误级,描述非致命但是会阻碍程序运行的消息
Warn:警告级,描述不损坏功能运行但是预期之外的行为的消息
Info:信息级,描述系统正常运行时事件和状态消息
Debug:调试级,描述系统一步一步运行的详细消息
ROS2中默认开启的日志级别是Info,会自动显示info级别以上的所有日志,包括Info、Warn、Error、Fatal。
运行节点时,
可以修改允许发布的日志级别,比如只想显示Warn级别以上的日志
ros2 run turtlesim turtlesim_node --ros-args --log-level WARN方便编写调试代码,设置成debug以上显示即可

launch文件(集成节点开启,一键运行所有功能的,ros2中launch为py脚本)

首先创建一个launch文件夹,作为后续放置launch文件的目录:
mkdir launch
接下来就可以创建launch文件:
Linux: touch launch/turtlesim_mimic_launch.py
macOs: touch launch/turtlesim_mimic_launch.py
Winows:type nul > launch/turtlesim_mimic_launch.py
示例
启动乌龟仿真的所有节点集成到launch文件中
在新建的launch文件内放入以下内容:效果,烏龜2會同步烏龜1的動作,其中mimic節點的作用就是订阅的乌龟1的位置转换成乌龟2的速度发布

from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='turtlesim',
            namespace='turtlesim1',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            namespace='turtlesim2',
            executable='turtlesim_node',
            name='sim'
        ),
        Node(
            package='turtlesim',
            executable='mimic',
            name='mimic',
            remappings=[
                ('/input/pose', '/turtlesim1/turtle1/pose'),
                ('/output/cmd_vel', '/turtlesim2/turtle1/cmd_vel'),
            ]
        )
    ])

创建工作空间

ROS默认是启动最上层的工作空间( overlay),上层工作空间中的功能包会覆盖(override)下层工作空间(underlay)中的同名功能包。所以有多个工作空间存在的时候,我们还需要注意设置工作空间的层次。
这里的意思大概就是,安装完ros2后我们在.bashrc中放入了
source /opt/ros/foxy/setup.bash
后面打开的终端都会激活ROS2自带的功能包,然后假设我们自己下载了nav2源码,且ROS2中安装了nav2,并在里面创建了自己的启动导航功能包,编译成功激活后,由于激活的这个工作空间内有两个包,一个是nav2源码包,一个是启动包,nav2源码功能包会覆盖ROS2中的nav2,而启动包相当于新增可使用的功能包。所以当需要对某一个工作空间激活的时候,需要清楚是否会影响后续我调用的功能包。
在这里插入图片描述

设置ROS2环境变量
工作空间的层次是通过环境变量来配置的,简单来说:下一个配置的工作空间会放到上一个配置的工作空间之上。 ROS2安装路径下的功能包一般会被我们设置为最下层的工作空间,所以我们在安装好ROS2之后,一定要记得在bashrc中设置如下ROS2安装路径的环境变量:
source /opt/ros/foxy/setup.bash

创建一个新的文件夹
开发每一个项目的工作空间,最好是独立创建一个文件夹,文件夹的名字可以自由定义,比如我们来创建一个开发用的空间空间,就叫做dev_ws:

mkdir -p ~/dev_ws/src

cd ~/dev_ws/src

放置例程代码
现在使用的终端已经cd到dev_ws/src路径下,接下来在这里先放置一些示例的功能包。
git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
稍等片刻, ros_tutorials 中的示例功能包就全部放到工作空间的src下边啦,其中这些内容: roscpp_tutorials rospy_tutorials ros_tutorials turtlesim 四个文件夹 现在已经在工作空间中放置好了示例功能包,在编译运行之前,还需要配置好这些功能包的依赖。

解决依赖问题
ROS2提供了自动化的依赖安装方式,需要我们在工作空间的根目录dev_ws下运行如下命令:(记住,后面常用)
rosdep install -i --from-path src --rosdistro foxy -y

成功后会显示
all required rosdeps installed successfully
这里需要注意一点,以上自动化安装依赖的前提是:每个功能包已经完整的将所依赖的包和库在package.xml文件中声明了。

若显示没有安装rosdep,则安装
sudo apt install python-rosdep2
然后按顺序执行下面命令,成功后再执行上面的命令
sudo rosdep init(失败的话参考 https://blog.csdn.net/qq_32705211/article/details/106183278) rosdep update

编译工作空间(常用有三种colcon build、colcon build --symlink-install、colcon build --packages-select 想编译的功能包)
在工作空间的根目录dev_ws下运行:
colcon build

如果提示colcon没有安装的话,可以使用如下命令安装:
sudo apt install python3-colcon-common-extensions

colcon是ROS2的编译工具,类似于ROS1中的catkin。
colcon build后边还可以跟一些常用的参数: --packages-up-to :编译指定的功能包,而不是整个工作空间–symlink-install :节省每次重建python脚本的时间–event-handlers console_direct+ :在终端中显示编译过程中的详细日志
编译结束后,在dev_ws工作空间下,有几个新创建的文件夹:build install log src其中的install文件夹就是未来运行所有节点启动文件和脚本的位置。
设置环境变量
cd ~/dev_ws
. install/local_setup.sh (前面的.后有空格,作用相当ros1中的source,记住,常用,有很多种source的方式,自己选择一种)

创建功能包

功能包是ROS2中组织代码的基本容器,方便我们编译、安装、分发开发的代码,一般来讲,每个功能包都是用来完成某项具体的功能相对完整的单元。
ROS2中的功能包可以使用CMake或者Python两种方式来编译,其本身是一个“文件夹”,但和文件夹不同的是,每个功能包中都会有这些文件:

CMake包:package.xml:功能包的描述信息CMakeLists.txt:描述CMake编译该功能包的规则

Python包:package.xml:功能包的描述信息setup.py:包含如何安装该包的说明setup.cfg:如果包内有可执行文件,需要设置该文件来让ros2 run命令找到它

创建功能包还是使用之前已经创建好的dev_ws工作空间,我们在其中的src文件夹中来创建新功能包。 打开终端后进入到dev_ws/src路径下:
cd ~/dev_ws/src
然后就可以使用如下语法来创建功能包了(以下二选一,CMakelist偏向ros1风格,pythonROS2风格):

CMake包: ros2 pkg create --build-type ament_cmake <package_name>

Python包: ros2 pkg create --build-type ament_python <package_name>

创建功能包的指令还允许设置节点名,自动生成一个helloworld的例程代码(以下二选一)。 CMake包:(my_node 为节点名,my_package为功能包名称)
ros2 pkg create --build-type ament_cmake --node-name my_node my_package

Python包:
ros2 pkg create --build-type ament_python --node-name my_node my_package

编译功能包接下来进入编译流程,一定要将终端cd到dev_ws的路径下来:
cd ~/dev_ws

然后就可以编译:
colcon build这个命令会编译工作空间中的所有功能包,如果只想编译某一个包的话,可以这样:

colcon build --packages-select my_package

设置环境变量,每次编译完工作空间,想使用里面的功能包徐需要设置环境变量打开一个新的终端,运行下工作空间的环境变量,这样才能让该终端找到新创建的包:
. install/setup.bash

运行功能包中的节点在终端中使用如下命令即可运行新建功能包的节点:cmake包和python的操作一样
ros2 run my_package my_node

在编写代码过程中新增加了什么依赖,都可以手动添加到这里来。
cmake包修改package.xml
python包修改package.xml和setup.py

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值