📇 本类导航
本页自动汇总「ROS」分类下的全部笔记(含子分类),随笔记增删实时更新。
欧拉角的单位是****弧度
1弧度=180/pai 度
1度=pai/180 弧度
记不住的时候就像圆
一个圆是360度,2pai弧度不用写一行代码,ROS都帮你写好了,你只需要调参(调参侠**** )
需要求的就为参考的坐标系
导航涉及的关键技术有如下五点:
1。全局地图
2。自身定位
3。路径规划
4。运动控制
5。环境感知
测试项目demo
一、先在小鱼下安装ros
wget http://fishros.com/install -O fishros && bash fishros根据提示一步一步下载即可,大佬就是大佬!!!(版本下载 ros1)
二、安装插件
背景
项目中需要开发与ROS生态和点云可视化相关的图形界面程序(例如开发一个实时接收雷达ros点云话题并显示的例程),经过调研发现在ubuntu上使用Qt是一个比较好的选择。这里对开发环境的配置过程进行记录,供大家参考。
环境:ubuntu20.04,ROS noetic搭建流程
1.ROS的安装会附带很多我们本次环境搭建中需要的包,例如cmake、qt5、pcl、vtk,因此直接安装ros是一个方便的选择,就不需要再单独下载这些东西了。
2.安装带ros插件的Qt5版本
ros-qt-plugin是一个可以将ros开发逻辑导入到Qt中的Qt插件,有了这个插件,使用Qt进行ros开发会方便很多。Qt官方的版本是不能向里面添加插件的,这里需要下载能添加插件的Qt5版本。首先到其github进行下载:
这里我下载的版本为0.4.3,因为从0.5开始使用的就是Qt6,而经测试Qt6不支持QVTK控件的导入。如下图所示,下载ROSProjectManager-0.4.1-Linux-x86_64.zip和Source code(tar.gz)两个文件。其中Source code(tar.gz)是Qt软件安装包,ROSProjectManager-0.4.1-Linux-x86_64.zip是Qt的ros插件。(下面有安装包)
安装包:
ros_qtc_plugin-0.4.3.tar.gz
rosprojectmanager-0.4.1-linux-x86_64.zip下载完毕后解压,打开Source code(tar.gz)解压后的目录,在终端输入下述指令,进行安装。首先在根目录下建立Qt-ros文件夹作为安装路径,然后开始安装:
mkdir ~/Qt-ros python3 setup.py --install_path ~/Qt-ros安装完毕后,打开刚安装好的Qt:
cd ~/Qt-ros/Tools/QtCreator/bin ./qtcreator点击菜单栏的帮助->About Qt Creator,可以看到我们安装了Qt5.15版本:
然后安装ros插件。点击帮助 ->关于插件 ,在弹出的窗口中选择“Install Plugin”,如下图所示:
指定插件的路径为刚才下载的ROSProjectManager-0.4.1-Linux-x86_64.zip文件的路径,下一步,进行确认。
安装位置可以选择Qt Creator的安装路径,便于对不同的Qt版本进行管理:
完成后重启Qt,进入关于插件,搜索ROS检查插件的开启情况:
这里看到插件已经成功安装(这里若安装失败可见文末的解决办法) ,点击菜单->文件 ->新建文件或项目 ,在“其他项目 ”中就可以找到ROS Workspace的选项,点击choose :
这里参考了官方的教程https://ros-qtc-plugin.readthedocs.io/en/latest/_source/How-to-Install-Users.html ,新建一个ros工作空间,输入name,构建系统选择为CatkinMake,指定工作空间路径,我的指定为根目录下新建的catkin_csdn文件夹:
完成后建立了一个空的工作空间:
这时需要我们手动建立该工作空间的文件结构:cd ~/catkin_csdn mkdir src catkin_make完成后重新打开Qt(如果系统中有多个Qt的版本,注意要打开本次安装的Qt) ,可以在Projects文字的下方打开刚才的ros项目(我的是catkin_csdn):
可以看到这时候文件的结构发生了变化:
右键点击src,选择Add New ,选择Package添加一个ros包:
输入包名,依赖中的Catkin中填入roscpp,导入基本的roscpp代码包:
到这里就使用Qt成功创建了一个ros包,可以在Qt中直接进行工作空间的编译了。此时的文件结构:
3.向Qt Designer中加入QVTK控件
Qt窗体开发本身并不自带QVTK控件,需要向Qt的特定安装路径自行加入一个QVTK的库文件
安装包为:
libqvtkwidgetplugin.so
下载libQVTKWidgetPlugin.so文件,将其复制到 ~/Qt-ros/Tools/QtCreator/lib/Qt/plugins/designer目录下,完成后可以重新打开Qt ,新建一个窗体工程,选择mainwindow.ui进入Qt Desinger界面:
可以看到控件列表最下方新增了一个QVTKWidget控件,就说明QVTK控件添加成功了。
4.创建Qt窗体工程并导入依赖
为了方便,需要使用cmake接管Qt窗体工程,并把Qt窗体工程的文件作为ros开发逻辑的一部分。这里仍然参照Qt官网的cmake教程进行操作:打开刚才安装的Qt,点击new project创建一个Qt Widgets Application(Qt窗体项目),使用默认选项,记住项目创建的路径。然后退出Qt,将刚才项目路径文件夹下自动生成的所有文件拷贝到刚才我们创建的ros包的src文件夹下 ,因为要使用cmake管理项目,故可删除无用的csdn.pro和csdn.pro.user文件。也就是拷贝下面四个文件到src下**** :
此时catkin_csdn工作空间的目录结构如下所示:
更改与src同级的包CMakeLists.txt文件为:cmake_minimum_required(VERSION 3.0.2) project(test) ## Compile as C++11, supported in ROS Kinetic and newer # add_compile_options(-std=c++11) ## Find catkin macros and libraries ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) ## is used, also find other catkin packages find_package(catkin REQUIRED COMPONENTS roscpp ) catkin_package() #some qt5-camke setting set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_AUTOUIC ON) #load Qt5 include and lib path variables find_package(Qt5 COMPONENTS Widgets REQUIRED) #load PCL and VTK include and lib path variables find_package(PCL REQUIRED) find_package(VTK REQUIRED) #note: <pcl> has included the <vtk>, so we just need to set the <pcl>'s include and lib path for project include_directories(${PCL_INCLUDE_DIRS}) #set the .h search path for <pcl> and <vtk> link_directories(${PCL_LIBRARY_DIRS}) #set the lib search path for <pcl> and <vtk> add_definitions(${PCL_DEFINITIONS}) add_executable(test1 src/mainwindow.ui src/mainwindow.cpp src/main.cpp ) target_link_libraries(test1 Qt5::Widgets ${VTK_LIBRARIES} ${PCL_LIBRARIES})其中,set(CMAKE_AUTOMOC ON)、set(CMAKE_AUTORCC ON)和set(CMAKE_AUTOUIC ON)指定了cmake接管Qt窗体工程的窗体构建逻辑,find_package(Qt5 COMPONENTS Widgets REQUIRED)引入了Qt5库,find_package(PCL REQUIRED)和find_package(VTK REQUIRED)显式引入了PCL和VTK,由于在安装ROS时它们都会被附带安装,因此在这里均能被找到。
修改后点击锤子进行编译,编译成功后将会在~/catkin_csdn/devel/lib/test目录下生成test1可执行文件,运行:cd ~/catkin_csdn/devel/lib/test ./test1运行后若窗体正确弹出,说明至此环境配置成功,可以在此工程中调用ros库、pcl库和vtk库,并可使用QVTKWidget实现一些显示功能。
一些常见问题的解决方案
1.Qt安装ros插件时提示安装失败
我在安装插件的时候遇到了这样的问题,在安装完成后重启Qt,提示:
这是由于插件的安装缺少了一个叫做libqtermwidget5.so.1的库文件
安装包:
libqtermwidget5.so.0
下载后将libqtermwidget5.so.0文件复制到与libROSProjectManager.so同级目录下即可。
** 在ROS(机器人操作系统)中,`declare_parameter是一个用于在ROS参数服务器上参数的函数。参数服务器是一个全局的键值存储系统,它允许不同的ROS节点之间共享参数 **
Ubuntu终端多窗口操作
# 安装 sudo apt-get install terminator # 卸载 sudo apt-get remove terminatorros::ok()的意思是如果结点不死,我都认为是符合条件的
ros::spinOnce()用在发布方
ros::spin()的意思是让节点保持运行别退出,用来订阅方
每新建一个终端,都需要 source ./devel/setup.bash 一下,否则tab补齐不了,因为你还没把这包加入到环境变量当中
获取当前时间戳:auto t2 = system_clock::now();ros中如果消息订阅和发布都没问题(用rqt_graph看过之后),但一直订阅不上,看是不是主函数有没有每一次循环后ros::spinOnce()
1.创建工作空间并初始化
mkdir -p 自定义空间名称/src cd 自定义空间名称 catkin_make #自动生成构建目录2.进入src创建ros包并添加依赖
cd src catkin_create_pkg 自定义ROS包名 roscpp rospy std_msgs上述命令,会在工作空间下生成一个功能包,该功能包依赖于roscpp 、rospy与std_msgs ,其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。
注意: 在ROS中,虽然实现同一功能时,C++和Python可以互换,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言:C++运行效率高但是编码效率低,而Python则反之,基于二者互补的特点,ROS设计者分别设计了roscpp与rospy库,前者旨在成为ROS的高性能库,而后者则一般用于对性能无要求的场景,旨在提高开发效率。3.进入ros包的src目录编辑源文件
cd 自定义的包/src touch helloworld_c.cpphelloworld_c.cpp(文件名自定义)
#include "ros/ros.h" int main(int argc,char *argv[]) { //解决中文乱码问题 setlocale(LC_ALL,""); //执行ros节点初始化 ros::init(argc,argv,"hello"); //创建ros节点句柄(非必须) ros::NodeHandle n; //控制台输出 hello world ROS_INFO("hello world!"); return 0; }返回上一级,修改CMakeLists.txt文件内容(136行,149 - 151行)
cmake_minimum_required(VERSION 3.0.2) project(hello) ## Compile as C++11, supported in ROS Kinetic and newer # add_compile_options(-std=c++11) ## Find catkin macros and libraries ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) ## is used, also find other catkin packages find_package(catkin REQUIR3ED COMPONENTS roscpp rospy std_msgs ) ## System dependencies are found with CMake's conventions # find_package(Boost REQUIRED COMPONENTS system) ## Uncomment this if the package has a setup.py. This macro ensures ## modules and global scripts declared therein get installed ## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html # catkin_python_setup() ################################################ ## Declare ROS messages, services and actions ## ################################################ ## To declare and build messages, services or actions from within this ## package, follow these steps: ## * Let MSG_DEP_SET be the set of packages whose message types you use in ## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...). ## * In the file package.xml: ## * add a build_depend tag for "message_generation" ## * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET ## * If MSG_DEP_SET isn't empty the following dependency has been pulled in ## but can be declared for certainty nonetheless: ## * add a exec_depend tag for "message_runtime" ## * In this file (CMakeLists.txt): ## * add "message_generation" and every package in MSG_DEP_SET to ## find_package(catkin REQUIRED COMPONENTS ...) ## * add "message_runtime" and every package in MSG_DEP_SET to ## catkin_package(CATKIN_DEPENDS ...) ## * uncomment the add_*_files sections below as needed ## and list every .msg/.srv/.action file to be processed ## * uncomment the generate_messages entry below ## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...) ## Generate messages in the 'msg' folder # add_message_files( # FILES # Message1.msg # Message2.msg # ) ## Generate services in the 'srv' folder # add_service_files( # FILES # Service1.srv # Service2.srv # ) ## Generate actions in the 'action' folder # add_action_files( # FILES # Action1.action # Action2.action # ) ## Generate added messages and services with any dependencies listed here # generate_messages( # DEPENDENCIES # std_msgs # ) ################################################ ## Declare ROS dynamic reconfigure parameters ## ################################################ ## To declare and build dynamic reconfigure parameters within this ## package, follow these steps: ## * In the file package.xml: ## * add a build_depend and a exec_depend tag for "dynamic_reconfigure" ## * In this file (CMakeLists.txt): ## * add "dynamic_reconfigure" to ## find_package(catkin REQUIRED COMPONENTS ...) ## * uncomment the "generate_dynamic_reconfigure_options" section below ## and list every .cfg file to be processed ## Generate dynamic reconfigure parameters in the 'cfg' folder # generate_dynamic_reconfigure_options( # cfg/DynReconf1.cfg # cfg/DynReconf2.cfg # ) ################################### ## catkin specific configuration ## ################################### ## The catkin_package macro generates cmake config files for your package ## Declare things to be passed to dependent projects ## INCLUDE_DIRS: uncomment this if your package contains header files ## LIBRARIES: libraries you create in this project that dependent projects also need ## CATKIN_DEPENDS: catkin_packages dependent projects also need ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package( # INCLUDE_DIRS include # LIBRARIES hello # CATKIN_DEPENDS roscpp rospy std_msgs # DEPENDS system_lib ) ########### ## Build ## ########### ## Specify additional locations of header files ## Your package locations should be listed before other locations include_directories( # include ${catkin_INCLUDE_DIRS} ) ## Declare a C++ library # add_library(${PROJECT_NAME} # src/${PROJECT_NAME}/hello.cpp # ) ## Add cmake target dependencies of the library ## as an example, code may need to be generated before libraries ## either from message generation or dynamic reconfigure # add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) ## Declare a C++ executable ## With catkin_make all packages are built within a single CMake context ## The recommended prefix ensures that target names across packages don't collide add_executable(haha src/helloworld_c.cpp) ## Rename C++ executable without prefix ## The above recommended prefix causes long target names, the following renames the ## target back to the shorter version for ease of user use ## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node" # set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "") ## Add cmake target dependencies of the executable ## same as for the library above # add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS}) ## Specify libraries to link a library or executable target against target_link_libraries(haha ${catkin_LIBRARIES} ) ############# ## Install ## ############# # all install targets should use catkin DESTINATION variables # See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html ## Mark executable scripts (Python etc.) for installation ## in contrast to setup.py, you can choose the destination # catkin_install_python(PROGRAMS # scripts/my_python_script # DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} # ) ## Mark executables for installation ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html # install(TARGETS ${PROJECT_NAME}_node # RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} # ) ## Mark libraries for installation ## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html # install(TARGETS ${PROJECT_NAME} # ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} # LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} # RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION} # ) ## Mark cpp header files for installation # install(DIRECTORY include/${PROJECT_NAME}/ # DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} # FILES_MATCHING PATTERN "*.h" # PATTERN ".svn" EXCLUDE # ) ## Mark other files for installation (e.g. launch and bag files, etc.) # install(FILES # # myfile1 # # myfile2 # DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} # ) ############# ## Testing ## ############# ## Add gtest based cpp test target and link libraries # catkin_add_gtest(${PROJECT_NAME}-test test/test_hello.cpp) # if(TARGET ${PROJECT_NAME}-test) # target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME}) # endif() ## Add folders to be run by python nosetests # catkin_add_nosetests(test)4.编译运行
回到工作目录,终端输入命令
# 编译 catkin_make # 打开一个新的终端,先启动ros核心 roscore # 运行 source ./devel/setup.bash rosrun helloworld haha #helloworld是功能包的包名,haha是配置文件CMakeLists.txt里定义的映射
1.话题通信机制(发布/订阅模式)
具体的实现流程为:创建两个人(节点),然后有共同的话题,发布方就发布消息,订阅方就接收消息
1.选定功能包右击 —> 添加launch文件夹
2.选定launch文件夹右击 —> 添加launch文件
3.编辑launch文件内容<launch> <node pkg="helloworld" type="demo_hello" name="hello" output="screen"> <node pkg="turtlesim" type="turtlesim_node" name="t1"> <node pkg="turtlesim" type="turtle_teleop_key" name="key1"> </launch>
node —> 包含的某个节点
pkg —> 功能包
type —> 被运行的节点文件
name —> 为节点命名
output —> 设置日志的输出目标
运行launch文件
roslaunch 包名 launch文件名5.运行结果:一次性启动了多个节点
系统:Ubuntu 18.04
安装ROS版本:melodic
前四个勾选
打开命令终端,输入以下命令1.添加ROS源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'2.添加秘钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C6543.安装ROS
sudo apt-get update如果部分不成功更换电脑连接手机热点试试,本人第一次安装就成功了。
sudo apt-get install ros-melodic-desktop-full大概需要两个多G,输入Y进行安装
4.安装并初始化rosdep
wget http://fishros.com/install -O fishros && . fishros ### 上行代码运行后根据提示输入4 ### 输入回车 # 根据提示rosdep初始化 rosdepc update #更新ros源5.设置环境变量
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrcsource ~/.bashrc至此,环境已经安装完了,开始测试~
6.启动运行小海龟例子
1.第一个终端运行如下命令
roscore2.打开第二个终端,也可以利用 Ctrl+Shift+T 快捷键打开一个新的终端,运行如下命令,这时你会看见一只静止的小海龟
rosrun turtlesim turtlesim_node3.如果希望小海龟能够移动,打开第三个终端,或者利用Ctrl+Shift+T快捷键再打开一个新的终端,启动turtlesim的键盘控制节点turtle_teleop_key,运行如下命令
rosrun turtlesim turtle_teleop_key(这里你的鼠标要停留在当前这个终端界面,按键盘上面的 上下左右 来控制小海龟的移动)
键盘上面的“上下左右” 小海龟移动情况
上 前进
下 后退
左 原地向左转
右 原地向右转
1.创建工作空间并初始化
mkdir -p 自定义空间名称/src cd 自定义空间名称 catkin_make #自动生成构建目录2.用VSCode打开
code . #在工作区文件夹下3.配置json文件
按住Ctrl+Shift+B ,在弹出的窗口中选择catkin_make:build右边的小齿轮
修改task.json文件{ "version":"2.0.0", "tasks":[ { "label": "catkin_make:debug", "type": "shell", "command": "catkin_make", "args": [], "group":{"kind": "build","isDefault": true}, "presentation":{ "reveal": "always" }, "problemMatcher": "$msCompile" } ] }4.编译
按住Ctrl+Shift+B ,默认编译整个工作空间
5.新建/编辑/编译运行功能包
右键工作区下的src文件夹,选择Create Catkin Package
第一个弹出框:输入功能包的包名
第二个弹出框:功能包的依赖,一般为roscpp rospy std_msgs










可以看到这时候文件的结构发生了变化:
右键点击src,选择Add New ,选择Package添加一个ros包:









