//前期ros安装-----已经完成
工作空间创建:
mkdir -p catkin_ws/src
cd catkin_ws
catkin_make
创建一个功能包
cd ~/catkin_ws/src
//使用catkin_create_pkg命令来创建一个名为'beginner_tutorials'的新程序包,这个程序包依赖于std_msgs、roscpp和rospy:
catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
编译
cd ~/catkin_ws/
catkin_make
工作空间(workspace)是一个存放工程开发相关文件的文件夹。
src
代码空间source space;
build
编译空间 build space;
devel
开发空间 development space
install
安装空间; —不怎麽常见了
package.xml
文件主要包含的是:前面是关于版本信息,作者等,最重要的是后面有各种依赖,需要关注;
CMakeLists.txt
文件非常重要;
—每一个功能包都有各自的这两个文件
写程序时,基本都要在这两个文件中修改。
常见命令:
执行:
roscore //启动ros master ,参数服务器,日志节点
rosrun // 运行指定的ros节点
rosrun 包名 可执行文件名
roslaunch //执行某包下的launch文件
roslaunch 包名 文件名
增:
catkin_create_pkg 自定义包名 依赖包 //创建新的ros功能包
sudo apt install xxx // 安装ros功能包
删:
sudo apt purge xxx //删除某个功能包
查:
rospack list //列出所有功能包
rospack find 包名 //查找某个功能包是否存在,如果存在返回路径
roscd 包名 //进入某个功能包
rosls 包名 //列出某包下的文件
apt search xxx //网络上搜索某个功能包
改:
rosed 包名 文件名 //修改功能包文件;需要安装vim
常用键:
Tab
– 用于补齐命令
Ctrl + C
--用于退出指令
Ctrl + Alt + T
--用于启动终端
ROS命令:
rostopic
ros话题消息
*rostopic list
显示活动的话题目录
*rostopic echo 话题名
实时订阅指定话题
rostopic find 消息类型名
显示使用指定类型的消息的话题
rostopic type 话题名
显示指定话题的消息类型
rostopic hz 话题名
显示指定话题的消息发布周期
*rostopic info 话题名
显示指定话题的消息类型
*rostopic pub 话题名消息类型 参数
用指定话题名称发布消息
rosservice
ros服务消息
*rosservice list
*rosservice info 服务名
rosservice type 服务名
rosservice find 服务名
rosservice args 服务名
显示服务参数
*rosservice call 服务名 参数
用输入的参数请求服务
rosnode
ros节点消息
*rosnode list
查看活动节点列表
rosnode ping 节点名
与指定节点进行连接测试
*rosnode info 节点名
查看指定节点信息
rosnode machine pc名或ip
查看该pc中运行节点列表 —多机通信
rosnode kill 节点名
停止指定节点的运行
rosnode cleanup
删除失连节点的注册信息
rosparam
ros参数消息 --很少在终端直接操作的
rosparam list
rosparam get 参数名
获取参数
rosparam set 参数名
设置参数
rosparam dump 文件名
将参数保存到指定文件
rosparam load 文件名
获取保存在指定文件中的参数
rosparam delete 参数名
删除参数
rosbag
记录和回放ros消息。
rosbag record 选项 话题名
将指定话题的消息记录到bag文件
rosbag info 文件名
查看bag文件的消息
rosbag play 文件1
回放
rosmsg
ros消息类型。
*rosmsg list
*rosmsg info 消息名
显示详细消息信息
rosmsg show 消息名
显示指定消息
rosmsg md5 消息名
显示md5sum
rosmsg package 功能包名
显示用于指定功能包的所有消息
rosmsg packages
显示使用过消息的所用功能包
rossrv
ros服务类型消息
rossrv list
显示所有服务
rossrv show 服务名
显示指定服务信息
rossrv md5 服务名
显示md5sum
rossrv package 功能包名
rossrv packages
rosversion
显示ros功能包版本消息
roswtf
检查ros系统
ROS中常见函数 — C++版本
ros::init()
函数:
作用:ROS初始化函数。
参数:argc
封装实参个数(n+1); argv
—封装参数的数组 ;name
为节点名-唯一性; options
—节点启动选项; 无返回值;
使用:
—argc ,argv
使用:如果按照ROS中的特定格式传入参数,就可以在cpp文件中使用。-实现外部传参
—options 使用: 节点名称需要保证唯一,则会导致节点不能重复启动,当重复启动时,之前节点就会被关闭掉。特定场景下,需要某一个节点多次启动,则可以使用options。
//example
ros::init(argc,argv,"xxx",ros::init_options::AnonymousName);//就会在节点名后加上一个随机数,保证不重名。
advertise()
函数:
作用:创建发布者对象;
参数:话题名称,队列长度,latch(可选):bool值,当为true,会保存发布方的最后一条消息,并且新的订阅连接到发布方时,发布方会将这条消息发送给订阅者。作用:以静态地图发布为例,方案1:可以使用固定频率发布地图数据,但是效率低;方案2:可以将地图发布对象的latch设置true,并且发布方只发布一次数据,每当订阅者连接时,将地图数据发送给订阅者(只发送一次),这样提高了效率。
使用:若订阅者订阅时,发布者已经发布结束,则默认情况下,订阅者并不会订阅到任何内容,若latch为true,则还是会订阅到发布者的最后一次数据。
spin()
函数:
spinOnce()
函数:
作用:当程序中存在回调函数时,当满足条件,并且执行到spin或者spinOnce函数时,就会触发回调函数,不同点在于spinOnce()只会进入回调函数一次,执行完后,就执行spinOnce后面的代码。而spin函数却会一直在此循环等待调用回调函数,不会退出,就不会执行后面的程序。
时刻:—必须初始化节点句柄。 —否则会导致时间API调用失败,在节点句柄初始化时会初始化时间操作。
获取当前时刻:ros::Time now = ros::Time::now();
----语句当前执行的时刻,时间参考系:1970年1月1日 00:00:00;now.toSec()
浮点型 now.sec()
整型 ----转化为以秒为单位 —距离参考系原点的时间
设定指定时刻: ros::Time t1(100.23);
----距离时间坐标系原点100.23秒 t1 就是100.23
持续时间:
作用:在程序执行中,可以停止一段时间,
实现:
—创建持续时间对象:ros::Duration du(4.5);
—调用: du.sleep()
;//休眠4.5秒
时间运算:
时刻与持续时间 : 可以相加,结果为时刻;
时刻与时刻:可以相减,结果为持续时间;
持续时间与持续时间:可以相加减,结果为持续时间;
//需求:每隔一秒,在控制台输出一段文本;
//实现:
//策略1:
ros::Rate(1);
//策略2:
//定时器:
ros::NodeHandle nh;
//首先,产生一个定时器
ros::Timer timer =nh.createTimer(ros::Duration(1),cb) //一共有4个参数,第一个是时间间隔,Duration类型;第二个参数是回调函数,第三个是bool类型的用来判断定时器是否为一次性定时器。第四个参数是判断定时器是否为自启动。若设置为不自动启动,则要调用另一个函数start()来手动启动。在回调函数中有一个参数是时间事件,TimerEvent .
ros::ok()
----用来判断节点是否正常
ros::shutdown()
---- 用来在程序中关闭节点
日志相关:
ROS::DEBUG("...");
调试消息 ----默认不会打印在控制台
ROS::INFO();
一般消息
ROS::WARN();
警告消息
ROS::ERROR();
错误消息
ROS::FATAL();
严重错误 ------颜色不一样;
元功能包的创建:----目前用不到,了解一下就行
1,首先创建一个没有依赖的功能包;
2,修改package.xml
文件,添加依赖,
<exec_depend> name_... </exec_depend> //---将所需要的包全部添加。
<export> <metapackage /> </export>
3,修改CMakeLists.txt
, 删除所有,仅保留下面:
cmake_mininum_required(VERSION 3.0.2)
catkin_metapackage()
project(该功能包名)
find_package(catkin_REQUIRED)
//不能有换行
launch文件使用:—非常重要,稍微大中型的功能包,都会用到launch文件。
launch文件标签—launch: launch标签是所有launch文件的根标签,充当其他标签的容器.属性
: deprecated = “弃用声明” —告知用户该launch文件已经弃用
子级标签
: 其他标签都是launch的子级。
属性的使用 :
<launch deprecated = "xxxxxxxxx" >
</launch>
//若调用该launch文件,就会在执行时出现警告,警告内容就是xxxxxx;
launch文件标签 — node: node标签用于ROS节点,是最常见的标签,需要注意的是:roslaunch命令不能保证按照node声明顺序来启动节点–节点的启动是多进程的。
属性
:
pkg = "包名"
type = "节点名" //----可执行文件的名称---cmakelist.txt中查阅
machine = "机器名"(可选) //---在指定机器上节点,当前基本就一台,故可以先不用管
name = "节点名称" //---可以自己临时起,在使用rosnode查看节点时,就会显示该名字
args = "xxx xxx xxx"(可选) //---将参数传递给接节点
respawn = "true|false"(可选) //---如果节点退出,是否重启。
respawn_delay ="N"(可选) //---如果respawn 为true,那将延迟N秒后重启节点。
required = "true|false"(可选) //--- 该节点是否必须,如果是true,那如果该节点退出,将杀死整个roslaunch
ns = "xxx"(可选) //---在指定命名空间下启动该节点。
clear_params = "true |false"(可选) //----启动前,删除节点的私有空间的所有参数。
output =
"log|screen"(可选) //---日志发送目标,可以是log文件或者屏幕,默认为log。
子级标签
:
env //---环境变量设置;
remap //---重映射节点名称;
rosparam //---参数设置;
param //---参数设置;
launch文件标签 — include : include标签用于将另一个xml格式的launch文件导入到当前文件。
属性
:
file = "$(find 包名)/xxx/xxx.launch" //---要包含文件路径
ns="xxx"(可选) //---在指定命名空间导入文件。
子级标签
:
env//---环境变量设置,
arg//---将参数传递给被包含的文件。
launch文件标签 — remap :用于话题重命名
属性
:from=“xxx” (原始话题名称) to = “yyy” (目标名称)
子级标签:无
launch文件标签 —param : param标签主要用于参数服务器上设置参数,参数源在标签中通过value指定,也可以通过外部文件加载。在标签中,相当于私有命名空间。在node标签里,会加前缀,前缀名为node名
属性
:name = “命名空间/参数名” 参数名可以包含命名空间; value = “xxx”(可选) --定义参数值,如果省略,必须指定外部文件作为参数源; type =
“str|int|double|bool|yaml”(可选) —指定参数类型,否则roslaunch会尝试确定参数类型。
子级标签
:无
launch文件标签 —rosparam: 可以从YAML文件导入参数,或者将参数导出到YAML文件,也可以删除参数,在node标签下会被视为私有。
属性
:
command = "load|dump|delete"(可选,默认为load) //--加载,导出,删除
file = "$(find xxxxx)/xxx/yyy" //---加载或者导出到yaml文件。
param = "参数名称"
ns= "命名空间"(可选)
子级标签
:无
launch文件标签 — group : 可以对节点进行分组,具有ns属性,可以让节点归属某个命名空间
属性
:
ns="名称空间"(可选)
clear_params = "true|false"(可选) //---启动前是否删除组名名称空间的所有参数-慎用
子级标签
:除launch标签之外的其他标签
launch文件标签 — arg : 用于动态传参,类似函数的参数,可以增强launch文件灵活性。
属性
:
name = "参数名称"
default = "默认值"(可选)
value = "数值"(可选 ---但不能与default同时使用)
doc = "参数描述"
子级标签: 无
ROS框架:
首先由一个master节点管理器和一系列节点node组成框架;
比如ros安装好的测试案例小乌龟。
roscore //启动节点管理器
rosrun turtlesim turtlesim_node //启动小乌龟节点
rosrun turtlesim turtle_teleop_key //启动键盘控制节点
rosnode list //查看节点
/*
/rosout
/teleop_turtle // ----键盘控制节点
/turtlesim // ----小乌龟节点名
*/
其次节点间可以通过多种通信方式进行通信,如话题:发布/订阅,服务:服务器/客户端,参数服务器,action等;
后面主要讲解话题,主要因为话题的使用率太高太高,其他几种相对较少一点,但大型的功能包编写,常见就是话题模型,以及使用到参数服务器。