文章目录
1、境外资源被屏蔽
- 错误提示:
ERROR: cannot download default sources list from:
https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list
Website may be down. - 解决思路:
通过修改hosts文件中的域名与IP映射解决 - 实现:
- 查询域名IP
网址 - 修改/etc/hosts文件
sudo gedit /etc/hosts
- 查询域名IP
2、Helloworld
1. C++版
- 创建工作空间并初始化
mkdir -p 空间名称/src //创建工作空间,并在工作空间下创建src文件夹,用来存放功能包 cd 空间名称 //切换到工作空间路径 catkin_make // 编译代码,会在工作空间下生成build和devel两个文件夹
- 进入src文件夹,添加一来
cd src catkin_creat_pkg 自定义功能包名 roscpp rospy std_msgs //创建功能包时一般都会用到这三个库,会在功能包下生成include,src两个文件和CMakeLists.txt文件
- 进入功能包的src文件
cd 功能包
创建helloworld_c.cpp文件//1.包含ROS头文件 #include "ros/ros.h" //2.编写main函数 int main(int argc, char *argv[]){ //3.初始化ROS节点,给节点命名 ros::init(argc,argv,"hello_node");//helo_node为节点名称,是一个字符串 //4.输出日志 ROS_INFO("hello world"); return 0; }
- 编辑ROS包下的Cmaklists.txt文件
add_executable(haha src/helloword_c.cpp)// haha为helloword_c.cpp的映射,通常映射名为被映射的文件名 target_link_libraries(haha ${catkin_LIBRARIES} ) //haha为节点名,与add_executable相对应
- 进入工作空间再次编译(一共编译两次)
cd 工作空间 catkin_make //生成build devel
- 执行
roscore cd 工作空间 source ./devel/setup.bash //更新环境变量 rosrun 包名 节点名(haha)//此处的节点名为自己定义的节点名
注意:
source ./devel/setup.bash 只能在当前终端下运行ROS节点,新的终端需要重新运行source ./devel/setup.bash 命令,才能运行ROS节点,解决办法:
法一:直接编辑.bashrc文件,最后添加source ./devel/setup.bash (需要crtl+h显示隐藏文件)
法二:echo "source ~/工作空间/devel/setup.bash">> ~/.bashrc
虽然一劳永逸,但是耦合增加,建议使用第一种方法
2. Python版
- 进入ROS包添加scripts文件夹,用于存放Python文件
cd ROS包 mkdir scripts
- 编辑Python文件
#导入Python解释器 #!/usr/bin/env python import rospy #导入ROS包 if __name__ == "__main__": rospy.init_node("Hello")#初始化ROS节点,取名为Hello rospy.loginfo("Hello World!!!")
- 为Python文件添加可执行文件
chmod +x 自定义的文件名.py
- 修改ROS包下的Cmakelists.txt文件
catkin_install_python(PROGRAMS scripts/helloworld_p.py //自己编写的Python文件 DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
- 进入工作空间编译
cd 工作空间 catkin_make
- 进入工作空间执行
roscore
cd 工作空间 source ./devel/setup.bash rosrun 包名 自定义文件名.py
3、Terminator终端快捷键
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 移动到之前的一个终端
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、VsCode中ROS功能包实现
1.C++版
- 创建ROS工作空间
mkdir -p 工作空间/src //必须有src cd 工作空间 catkin_make //编译 code . //启动vscode
- 在vscode中设置编译ROS的快捷键
- 快捷键crtl+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
- 设置包名–>添加依赖:roscpp rospy std_msgs
- 编写程序:
#include"ros/ros.h" //引入ROS包 int main(int argc, char *argv[]){ setlocale(LC_ALL,"");//防止中文乱码 ros::init(argc,argv,"hello_vscode"); ROS_INFO("hello哈哈 vscode!!!"); return 0; }
如果没有代码提示,修改.vscode/c_cpp_properties.json
设置 “cppStandard”:“c++17” - 配置CmakeLists.txt
add_executable(节点名称 src/C++源文件名.cpp ) target_link_libraries(节点名称 ${catkin_LIBRARIES} )
- 编译执行
编译:crtl+shift+B 执行:roscore-->source ./devel/setup.bash-->rosrun 包名 节点名
2.Python版
- 假设已经创建好功能包
- 在功能包下创建scripts,用于存放.py文件
- 编写Python文件
#解释器声明 #可以选择Python和Python3(noetic默认为3.8) #! /usr/bin/env python import rospy if __name__ == "__main__": rospy.init_node("hello_vscode_p") rospy.loginfo("hello vscode,我是python!")
- 给Python文件添加可执行权限
chmod +x *.py
- 配置CMakeLists.txt文件
在noetic版本中,需要配置该文件,以前的版本不需要配置该文件,但是该版本的标准步骤需要配置,所以以后按照标准配置进行编程catkin_install_python(PROGRAMS scripts/自定义文件名.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
- 编译执行
- 编译:crtl+shift+B
- roscore
- rosrun 包名 节点名.py
3.在不编译的情况下,直接运行Python文件,会抛出异常
表现:
Traceback (most recent call last):
File "/media/d102/EPAN/Desktop/code_study_ubuntu/rosdemo_02/src/hello_vscode/scripts/hello_noconfig.py", line 3, in <module>
import rospy
File "/opt/ros/noetic/lib/python3/dist-packages/rospy/__init__.py", line 49, in <module>
from .client import spin, myargv, init_node, \
File "/opt/ros/noetic/lib/python3/dist-packages/rospy/client.py", line 52, in <module>
import roslib
File "/opt/ros/noetic/lib/python3/dist-packages/roslib/__init__.py", line 50, in <module>
from roslib.launcher import load_manifest # noqa: F401
File "/opt/ros/noetic/lib/python3/dist-packages/roslib/launcher.py", line 42, in <module>
import rospkg
ImportError: No module named rospkg
原因:
在noetic版本中,标准的编写Python功能包是需要配置
CmakeLists.txt文件的,以前的版本是不需要的。在不
编译的情况下,如果编译器代码为`#! /usr/bin/env
python`,代码是不能直接运行的,`#! /usr/bin/
env python3`可以直接运行。这是因为在noetic版本
中,Python版本为3.8。
解决办法:
解决一:(不推荐)
#! /usr/bin/env python3
不推荐这种方法,因为当使用以前的Python开发包的时候,需要一个一个修改,太麻烦
解决二:(推荐)
创建软连接,将Python连接到Python3
sudo ln -s /usr/bin/python3 /usr/bin/python
如果提示文件已存在,则修改命令:
sudo ln -f /usr/bin/python3 /usr/bin/python
5、launch文件
- 作用
同时启动多个节点,提高工作效率 - 实现
- 在功能包下添加launch文件夹
- 在launch文件下添加文件名.launch文件
- 编写文件内容
<launch> <node pkg="turtlesim" type="turtlesim_node" name="t1"/> <node pkg="turtlesim" type="turtle_teleop_key" name="key1"/> <node pkg="hello_vscode" type="hello_vscode_c" name="key2" output="screen"/> </launch> 注: node:包含的某个节点,不需要修改 pkg:功能包 type:节点名,不包含后缀 name:给节点重新起的名 output:保证在屏幕上有输出,否则输出不在屏幕上显示
- 运行launch文件
roslaunch 包名 launch文件名
注意:运行前要更新环境变量
source ./devel/setup.bash
6、 ROS文件系统
- 结构图
WorkSpace --- 自定义的工作空间
|--- build:编译空间,catkin_make之后出现,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,catkin_make之后出现,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码,用于存放功能包文件夹
|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件,在写cpp和py的时候要修改
|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
|-- scripts 存储python文件
|-- src 存储C++源文件
|-- include 头文件
|-- msg 消息通信格式文件
|-- srv 服务通信格式文件
|-- action 动作格式文件
|-- launch 可一次性运行多个节点
|-- config 配置信息
|-- CMakeLists.txt: 编译的基本配置
7、ROS相关命令
- 增
catkin_creat_pkg:创建功能包,在vscode中,可以右键创建 sudo apt install xxx:安装ROS功能包
- 删
sudo apt purge xxx:删除功能包
- 查
rospack list:列出所有功能包 rospack find 包名:查找包是否存在,如果存在,返回包的路径 roscd 包名:进入某个功能包 rosls 包名:列出某个包下的文件 apt search xxx:在网络上搜索某个功能包
- 改
rosed 包名 文件名:修改功能包文件
- 执行
- roscore
1.1.rosrun 包名 可执行文件名
1.2.roslaunch 包名 launch文件名
- roscore
8、ROS计算图
安装:
$ sudo apt install ros-<distro>-rqt
$ sudo apt install ros-<distro>-rqt-common-plugins
distro:Ubuntu版本名(noetic)
运行:
rqt_graph 或者 rosrun rqt_graph rqt_graph