前言
本文是一篇附属文章,总文章:ROS学习笔记总纲目_Jenlibein的博客-CSDN博客
正文
1.简要说明
本次学习主要跟进Autolabor的教程进行学习
(1)Autolabor:
b站视频:【Autolabor初级教程】ROS机器人入门_哔哩哔哩_bilibili
课程文档:Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
(2)鱼香ROS:
b站视频:【鱼香ROS】动手学ROS2|ROS2基础入门到实践教程|小鱼带你手把手学习ROS2_哔哩哔哩_bilibili CSDN:【ROS2机器人入门到实战】4.ROS2初体验_鱼香ROS的博客-CSDN博客
2.ROS2安装
2.1问题解决
一开始我用原本已经安装好的Ubuntu 22.04.3系统去跟进Autolabor视频教程的安装步骤。但是到了设置安装源那一步,发现总是出现提示:无法安全地用该源进行更新,所以默认禁用该源。这让人十分头疼,于是我跑到网上找解决方法,却弹出各种方案。
于是我想是不是系统的问题,于是我下载了Autolabor提供的系统版本(20.04):ubuntu-releases-20.04安装包下载_开源镜像站-阿里云
果然接下来比较顺利的完成了。
但是到了初始化rosdep时候又弹出了ERROR,这次Autolabor有给出解决方案,具体查看该页后记,即第6点:1.2.4 安装 ROS · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
但是个人认为这个方法又是太麻烦,我又到网上看了看,发现一个很好的方法:ROS rosdep update更新失败(简单解决)_rosdep update reading in sources list data from /e-CSDN博客
最后我发现一个最好的安装方法,就是鱼香ROS中提供的【一键安装】。相信在经历之前这么多的安装事故之后,发现【一键安装】是多么令人向往。
我们在Ubuntu中打开终端,输入以下代码:
sudo wget http://fishros.com/install -O fishros && . fishros
然后选择安装ROS2桌面版即可,我这里选择与Autolabor安装一样Ubuntu 20.04.6的ROS2 noetic版
详细安装教程参考鱼香ROS:【ROS2机器人入门到实战】3.动手安装ROS2_ros2安装-CSDN博客
注意!
Ubuntu22.04以上只支持安装ROS2
我们下载ROS1,可用一键安装里面Melodic的ROS1版本
2.2测试-ROS体验
首先启动一个终端,输入
roscore
2.2.1涂鸦乌龟
打开新的终端Ctrl+Alt+T,输入下面的指令,启动模拟器
rosrun turtlesim turtlesim_node
启动一个新的终端Ctrl+Alt+T,输入以下指令,启动遥控器
rosrun turtlesim turtle_teleop_key
此时按上下左右就可以控制乌龟了
2.2.2RQT可视化
保持前面的海龟运行状态,打开新的终端,输入rqt。
进入界面后选择以下选项
选择完成后就可以看到以上两个节点之间的数据关系了。
2.2.3拓展:信息发送与接收
此处似乎是因为ROS版本不同导致的无法运行
3.HelloWorld实现
3.1创建工作空间并初始化
1.创建文件夹
首先进入用户目录
cd ~
接着输入下述命令(首先会创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make命令编译。我的自定义名称为Demo01_ws。)
mkdir -p 自定义空间名称/src
cd 自定义空间名称
catkin_make
2进入 src 创建 ros 包并添加依赖
以下命令,会在工作空间下生成一个功能包,该功能包依赖于 roscpp、rospy 与 std_msgs,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。此处自定义ROS包名为helloworld
cd src
catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs
3.2实现helloworld
进入到自定义ROS包名的文件夹中
创建cpp文件(也可以用python,则创建py文件)
这里用vim打开,当然你也可以用gedit或者vscode来写
cd helloworld
vim helloworld.cpp
粘贴以下之后打上 ( :wq )退出
#include "ros/ros.h"
int main(int argc, char *argv[])
{
//执行 ros 节点初始化
ros::init(argc,argv,"hello");
//创建 ros 节点句柄(非必须)
ros::NodeHandle n;
//控制台输出 hello world
ROS_INFO("hello world!");
return 0;
}
编辑 ros 包下的 Cmakelist.txt文件(去掉原来文件下的某行#号并修改部分内容,可以用搜索功能)
add_executable(步骤3的源文件名 #此处不一定要源文件名,可以自行修改,不过用源文件名方便记忆
src/步骤3的源文件名.cpp
)
target_link_libraries(步骤3的源文件名 #此处与第一行定义的名称一致
${catkin_LIBRARIES}
)
我的使用例:
add_executable(haha #这里我就没用源文件名,随便定义名字为haha,注意不能和包名相同
src/helloworld.cpp
)
target_link_libraries(haha
${catkin_LIBRARIES}
)
进入工作空间目录并编译
cd ~/Demo01_ws #此处为你自定义的包名
catkin_make
接下来就可以执行了
先进入新的终端页面输入roscore
然后再进入另一个新的终端输入
cd 工作空间
source ./devel/setup.bash
rosrun 包名 C++节点
例:
cd ~/Demo01_ws
source ./devel/setup.bash
rosrun helloworld haha
命令行输出: HelloWorld!
source的作用
是将环境变量刷新到当前的终端窗口上,没有刷新则不能执行功能包的相关节点。
若想实现所有终端窗口都能执行功能包的相关节点则要将source ~/工作空间/devel/setup.bash
添加进.bashrc
文件,使用上更方便。
添加方式1: 直接使用 gedit 或 vi 编辑 .bashrc 文件,最后添加该内容
添加方式2:echo "source ~/工作空间/devel/setup.bash" >> ~/.bashrc
4.集成开发环境
4.1 安装终端
在 ROS 中,需要频繁的使用到终端,且可能需要同时开启多个窗口
这里有一款较为好用的终端:Terminator。
sudo apt install terminator
(1)快捷键
Alt+Up //移动到上面的终端
Alt+Down //移动到下面的终端
Alt+Left //移动到左边的终端
Alt+Right //移动到右边的终端
Ctrl+Shift+O //水平分割终端
Ctrl+Shift+E //垂直分割终端
Ctrl+Shift+Right //在垂直分割的终端中将分割条向右移动
Ctrl+Shift+Left //在垂直分割的终端中将分割条向左移动
Ctrl+Shift+Up //在水平分割的终端中将分割条向上移动
Ctrl+Shift+Down //在水平分割的终端中将分割条向下移动
Ctrl+Shift+S //隐藏/显示滚动条
Ctrl+Shift+F //搜索
Ctrl+Shift+C //复制选中的内容到剪贴板
Ctrl+Shift+V //粘贴剪贴板的内容到此处
Ctrl+Shift+W //关闭当前终端
Ctrl+Shift+Q //退出当前窗口,当前窗口的所有终端都将被关闭
Ctrl+Shift+X //最大化显示当前终端
Ctrl+Shift+Z //最大化显示当前终端并使字体放大
Ctrl+Shift+N or Ctrl+Tab //移动到下一个终端
Ctrl+Shift+P or Ctrl+Shift+Tab //Crtl+Shift+Tab 移动到之前的一个终端
(2)有关各个标签之间的操作
F11 //全屏开关
Ctrl+Shift+T //打开一个新的标签
Ctrl+PageDown //移动到下一个标签
Ctrl+PageUp //移动到上一个标签
Ctrl+Shift+PageDown //将当前标签与其后一个标签交换位置
Ctrl+Shift+PageUp //将当前标签与其前一个标签交换位置
Ctrl+Plus (+) //增大字体
Ctrl+Minus (-) //减小字体
Ctrl+Zero (0) //恢复字体到原始大小
Ctrl+Shift+R //重置终端状态
Ctrl+Shift+G //重置终端状态并clear屏幕
Super+g //绑定所有的终端,以便向一个输入能够输入到所有的终端
Super+Shift+G //解除绑定
Super+t //绑定当前标签的所有终端,向一个终端输入的内容会自动输入到其他终端
Super+Shift+T //解除绑定
Ctrl+Shift+I //打开一个窗口,新窗口与原来的窗口使用同一个进程
Super+i //打开一个新窗口,新窗口与原来的窗口使用不同的进程
4.2 vscode配置
4.2.1安装
进入vscode官网,下载Linux的.deb版并安装:Documentation for Visual Studio Code
需要安装的vscode插件:(1)C++ (2)CMake Tools (3)Python (4)ROS
4.2.2基本配置
创建ROS工作空间
mkdir -p xxx_ws/src(必须得有 src)
cd xxx_ws
catkin_make
启动vscode
cd xxx_ws
code . #在该目录下启动vscode
vscode中编译ros
快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build
可以点击配置设置为默认,修改.vscode/tasks.json 文件
{
// 有关 tasks.json 格式的文档,请参见
// https://go.microsoft.com/fwlink/?LinkId=733558
"version": "2.0.0",
"tasks": [
{
"label": "catkin_make:debug", //代表提示的描述性信息
"type": "shell", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
"command": "catkin_make",//这个是我们需要运行的命令
"args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
"group": {"kind":"build","isDefault":true},
"presentation": {
"reveal": "always"//可选always或者silence,代表是否输出信息
},
"problemMatcher": "$msCompile"
}
]
}
创建 ROS 功能包:选定 src 右击 ---> create catkin package
设置包名(例:hello_vscode)添加依赖(roscpp rospy std_msgs)
在功能包的 src 下新建 cpp 文件
/*
控制台输出 HelloVSCode !!!
*/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
setlocale(LC_ALL,"");
//执行节点初始化
ros::init(argc,argv,"HelloVSCode");
//输出日志
ROS_INFO("Hello VSCode!!!哈哈哈哈哈哈哈哈哈哈");
return 0;
}
PS1如果没有代码提示
修改 .vscode/c_cpp_properties.json
设置 "cppStandard": "c++17"
PS2: main 函数的参数不可以被 const 修饰
PS3当ROS__INFO 终端输出有中文时,会出现乱码
解决办法:在函数开头加入下面代码的任意一句
setlocale(LC_CTYPE, "zh_CN.utf8");
setlocale(LC_ALL, "");
配置CMakeLists.txt
#C++:
add_executable(节点名称
src/C++源文件名.cpp
)
target_link_libraries(节点名称
${catkin_LIBRARIES}
)
#python:
catkin_install_python(PROGRAMS scripts/自定义文件名.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
编译执行
编译: ctrl + shift + B
执行: 和之前一致,只是可以在 VScode 中添加终端,首先执行:source ./devel/setup.bash
4.3 launch文件展示
4.3.1需求
一个程序中可能需要启动多个节点,比如:ROS 内置的小乌龟案例。如何一次性启动所有节点?官方给出的优化策略是使用 launch 文件,可以一次性启动多个 ROS 节点。
4.3.2实现
1 选定功能包右击 ---> 添加 launch 文件夹
2 选定 launch 文件夹右击 ---> 添加 launch 文件
3 编辑 launch 文件内容
<launch>
<!-- 添加被执行的节点 -->
<!--乌龟gui-->
<node pkg="turtlesim" type="turtlesim_node" name="turrle_GUI"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="turrle_key"/>
<node pkg="hello_vscode" type="hello_vscode_c" name="hello" output="screen"/>
</launch>
node ---> 包含的某个节点
pkg -----> 功能包
type ----> 被运行的节点文件
name --> 为节点命名
output-> 设置日志的输出目标
运行环境:source ./devel/setup.bash
运行 launch 文件:roslaunch 包名 launch文件名
例:roslaunch hello_vscode start_turrle.launch
5.ROS架构
5.1文件系统
WorkSpace --- 自定义的工作空间
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码
|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件
|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
|-- scripts 存储python文件
|-- src 存储C++源文件
|-- include 头文件
|-- msg 消息通信格式文件
|-- srv 服务通信格式文件
|-- action 动作格式文件
|-- launch 可一次性运行多个节点
|-- config 配置信息
|-- CMakeLists.txt: 编译的基本配置
5.2文件系统相关命令
5.2.1执行
1.roscore是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。
用法:
roscore
指定端口:
roscore -p xxxx
roscore 将启动: 1.ros master 2.ros 参数服务器 3.rosout 日志节点
2.rosrun运行指定的ROS节点
rosrun 包名 可执行文件名
例:
rosrun turtlesim turtlesim_node
3.roslaunch执行某个包下的 launch 文件
roslaunch 包名 launch文件名
5.2.2功能包
1.创建
catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包
sudo apt install xxx === 安装 ROS功能包
2.删除
sudo apt purge xxx ==== 删除某个功能包(purge是不保留配置文件,若要保留则选remove)
3.查询
rospack list === 列出所有功能包
rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径(例:rospack find turtlesim 查询海龟功能包)
roscd 包名 === 进入某个功能包
rosls 包名 === 列出某个包下的文件
apt search xxx === 搜索某个功能包(可用通道符接"grep -i 所需功能包名"来获取所需的功能包)
4.修改
rosed 包名 文件名 === 修改功能包文件(需要安装 vim)
比如:rosed turtlesim Color.msg
5.3计算图
说明:此处与【2.2测试】中的【2.2.2rqt可视化】一致
1.安装(如果安装的是桌面完整版就不需要安装)
sudo apt install ros-<distro>-rqt
sudo apt install ros-<distro>-rqt-common-plugins
#请使用你的ROS版本名称(比如:kinetic、melodic、Noetic等)来替换掉<distro>。
2.运行
rqt_graph
或
rosrun rqt_graph rqt_graph
可以看到网络拓扑图,该图可以显示不同节点之间的关系。