ROS2使用教程
工作空间
ROS工作空间是一个具有特定结构的目录。通常有一个
src
子目录。在该子目录下是ROS软件包的源代码所在位置。通常该目录开始时为空。colcon进行外部构建。默认情况下,它会创建以下目录作为
src
目录的同级目录:
build
目录将用于存储中间文件。对于每个软件包,将在其中创建一个子文件夹,例如在该子文件夹中调用 CMake。install
目录是每个软件包将要安装到的位置。默认情况下,每个软件包将被安装到单独的子目录中。log
目录包含有关每个 colcon 调用的各种日志信息。
创建工作空间
mkdir -p demo/src
cd demo/src
创建功能包
ros2 pkg create <packpage-name> --build-type ament_cmake --dependencies rclcpp
在本教程中,使用可选参数--node-name
,它将在包中创建一个简单的Hello World类型的可执行文件:ros2 pkg create --build-type ament_cmake --node-name my_node my_package
创建节点
- 头文件 #include "rclcpp/rclcpp.hpp"
- 初始化 ROS2
- 定义节点类
- 循环节点
- 释放资源
/* 头文件 #include "rclcpp/rclcpp.hpp" */
#include "rclcpp/rclcpp.hpp"
构建软件包
colcon build
colcon build --packages-select my_package
colcon build
的其他有用参数:
--packages-up-to
构建所需的包及其所有依赖项,而不是整个工作空间(节省时间)--symlink-install
在您调整Python脚本时,无需每次重新构建--event-handlers console_direct+
在构建时显示控制台输出(否则可在log
目录中找到)
加载环境变量
当colcon成功构建完成后,输出将位于install
目录中。在您可以使用任何已安装的可执行文件或库之前,您需要将它们添加到您的路径和库路径中。colcon会在install
目录中生成bash/bat文件来帮助设置环境。这些文件将会将所有所需的元素添加到您的路径和库路径中,并提供由软件包导出的任何bash或shell命令。
source install/setup.bash
启动界面
http://www.network-science.de/ascii/
测试:sudo run-parts /etc/update-motd.d
- 一. 进入update-motd.d目录cd /etc/update-motd.d, 里面的文件都是shell脚本, 用户登录时服务器会自动加载这个目录中的文件, 所以就能看到欢迎信息了. 可以发现目录中的文件名都是数字开头的, 数字越小的文件越先加载
- 二. 比如创建60-my-welcome-info文件, sudo vim 60-my-welcome-info 文件的第一行必须是#!/bin/sh或者#!/bin/bash, 这是告诉系统要用相关的shell解析该文件 文件的第一行必须是#!/bin/sh或者#!/bin/bash, 这是告诉系统要用相关的shell解析该文件 文件的第一行必须是#!/bin/sh或者#!/bin/bash, 这是告诉系统要用相关的shell解析该文件 剩下的就根据自身需求写了, 使用的是shell脚本语法
- 三. 给脚本文件增加可执行权限,sudo chmod 755 60-my-welcome-info
ROS2节点
Goal目标: Learn了解ROS 2中节点的功能以及与它们交互的工具。
ROS中的每个节点应负责单个模块目的 (例如,一个用于控制车轮电机的节点,一个用于控制激光测距仪的节点等)。每个节点可以通过话题、服务、动作或参数向其他节点发送和接收数据。一个完整的机器人系统由许多协同工作的节点组成。在ROS 2中,单个可执行文件 (cprogram程序、Python程序等) 可以包含一个或多个节点。
基本使用
运行节点操作
ros2 run <package_name> <executable_name>
显示所有正在运行的节点的名称:
ros2 node list
默认节点属性 (如节点名称、话题名称、服务名称等) 重新分配给自定义值,如名称
ros2 run <package_name> <executable_name> --ros-args --remap __node:=<executable_name>
ros2节点信息
ros2 node info <node_name>
ROS2话题Topic
ROS 2将复杂的系统分解成许多模块化节点。话题是ROS图中至关重要的元素,它充当节点交换消息的总线。
节点可以将数据发布到任意数量的话题,同时订阅任意数量的话题。
话题是数据在节点之间移动,从而在系统的不同部分之间移动的主要方式之一。
查看正在发布的关于某个话题的数据
ros2 topic echo <topic_name>
话题信息
ros2 topic info <topic_name>
界面展示
节点使用消息通过话题发送数据。发布者和订阅者必须发送和接收相同类型的消息才能进行通信。
我们之前在运行 ros2 topic list -t
后看到的话题类型让我们知道每个话题使用了什么信息类型。重新调用 cmd_vel
话题的类型:
geometry_msgs/msg/Twist
这意味着在 geometry_msgs
包装中有一个 msg
调用 Twist
。 [待校准@8844]
现在我们可以在这种类型上运行 ros2 interface show <msg type>
来了解它的细节,特别是调用y,消息期望的数据结构。
ros2 interface show geometry_msgs/msg/Twist
对于上面的消息类型,它产生:
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
Vector3 angular
这告诉你, /turtlesim
节点期望有两个向量的消息, linear
和 angular
,每个向量有三个元素。如果你重新调用数据,我们看到 /teleop_turtle
用 echo
命令传递给 /turtlesim
,它的结构是一样的
话题酒吧
消息结构,您可以使用以下命令直接从命令行将数据发布到话题上
ros2 topic pub <topic_name> <msg_type> '<args>'
‘
需要注意的是,此参数需要以YAML语法输入。输入完整命令,如下所示:
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
is是一个可选参数,意思是 "发布一条消息然后退出"。
您将在终端中收到以下消息:
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))
数据发布的速率
ros2 topic hz <topic_name>
URDF机器人建模
- ROS2进阶第一章 – 从头开始构建一个可视化的差速轮式机器人模型 – 学习URDF机器人建模与xacro优化_两轮差速机器人在ros中的urdf-CSDN博客
- ROS高效进阶第二章 – 以差速轮式机器人为例,学习URDF机器人建模与xacro优化_两轮差速机器人urdf-CSDN博客
- ROS高效进阶第三章 – 以差速轮式机器人为例,使用Gazebo构建机器人仿真平台_ros 差速轮-CSDN博客
- ROS2 高效学习系列_ros2高效学习-CSDN博客
差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。 此次建模,不引入算法,只是把机器人模型的样子做出来,所以只使用 rivz 进行可视化显示。
参考资料
- 两轮差速机器人运动学模型_两轮差速运动学模型-CSDN博客
- 17.URDF:ROS机器人建模方法_哔哩哔哩_bilibili
- 从头开始构建一个可视化的机器人模型 — ROS 2 Documentation: Humble 文档 (fishros.org)
- 古月·ROS2入门21讲——学习笔记(一)核心概念部分1-14讲_古月居ros21讲笔记-CSDN博客
- 古月·ROS2入门21讲——学习笔记(二)常用工具部分15-21讲_ros2 21-CSDN博客
机器人的定义和构成
机器人定义:机器人通常被定义为能够执行预先编程任务的自动化机械装置或人工智能系统。这些任务可以涉及各种各样的活动,从简单的生产线上的重复性工作,到复杂的手术操作或危险环境中的探索。通常,机器人具有传感器来感知周围环境,并且能够根据这些感知采取行动。机器人的形态可以各不相同,有些像人类,有些像动物,有些则完全抽象。机器人通常被用于自动化生产和加工、执行危险任务、探索和科学研究等领域。 机器人构成:机器人一般是由硬件结构、驱动系统、传感器系统、控制系统四大部分组成,市面上一些常见的机器人,无论是移动机器人还是机械臂,我们都可以按照这四大组成部分进行分解。
-
硬件结构就是底盘、外壳、电机等实打实可以看到的设备;
- 驱动系统就是可以驱使这些设备正常使用的装置,比如电机的驱动器,电源管理系统等;
- 传感系统包括电机上的编码器、板载的IMU、安装的摄像头、雷达等等,便于机器人感知自己的状态和外部的环境;
- 控制系统就是我们开发过程的主要载体了,一般是树莓派、电脑等计算平台,以及里边的操作系统和应用软件。
机器人建模的过程,其实就是按照类似的思路,通过建模语言,把机器人每一个部分都描述清楚,再组合起来的过程。
机器人四大部分的控制回路,大致如图:
-
执行机构:人体的手和脚,直接面向工作对象的机械装置。
- 驱动系统:人体的肌肉和筋络,负责驱动执行机构,将控制系统下达的命令转换成执行机构需要的信号。
- 传感系统:人体的感官和神经,主要完成信号的输入和反馈,包括内部传感系统和外部传感系统。
- 控制系统:人体的大脑,实现任务及信息的处理,输出控制命令信号。
URDF建模套路
ROS中的建模方法叫做URDF,全称是统一机器人描述格式,不仅可以清晰描述机器人自身的模型,还可以描述机器人的外部环境,比如这里的桌子,也可以算作一个模型。
URDF模型文件使用的是XML格式,上图就是一个机器人的URDF描述,乍看上去,有点像网页开发的源代码,都是由一系列尖括号包围的标签和其中的属性组合而成。
如何使用这样一个文件描述机器人呢?比如这个机械臂,大家可以看下自己的手臂,我们的手臂是由大臂和小臂组成,他们独自是无法运动的,必须通过一个手肘关节连接之后,才能通过肌肉驱动,产生相对运动。
在建模中,大臂和小臂就类似机器人的这些独立的刚体部分,称为连杆Link,手肘就类似于机器人电机驱动部分,称为关节joint。
所以在URDF建模过程中,关键任务就是通过这里的< link >和< joint >,理清楚每一个连杆和关节的描述信息。
连杆Link的描述
< link >标签用来描述机器人某个刚体部分的外观和物理属性,外观包括尺寸、颜色、形状,物理属性包括质量、惯性矩阵、碰撞参数等。
终端
sudo apt-get install terminator
更新后,打开终端,可以使用"Crtl + Shift + E",在同一终端下,进行分屏打开终端
rosdep
rosdep命令可以用来安装功能包的依赖项
sudo apt-get install python-rosdep
第一次安装需要进行初始化
sudo rosdep init
这将在/etc/ros/rosdep/sources.list.d中,创建20-default.list文件,文件中包含ROS官网的5个下载路径,然后更新缓存
rosdep update
rosdep的使用 在使用前,需要先更新,即2中更新语句
(1)查看需要的依赖项
rosdep check --from-paths src --ignore-src -r -y
(2)安装依赖项
rosdep install --from-paths src --ignore-src -r -y
注:此法并非所有依赖项都能自动安装,如若colcon build仍报缺包的错误
sudo apt-get install ros-版本号-包名
安装cp210x驱动 usbserial
sudo modprobe usbserial
检测端口号
ls -l /dev |grep ttyUSB*
串口权限开启
临时权限(现用)
sudo gedit /etc/udev/rules.d/70-ttyusb.rules