最近因工做须要,学习了一下ROS(机器人操做系统)。说是系统,其实只是一个运行在Linux下的一个框架,具备强大的分布式功能。下面是总结的一些知识点,懒得仔细整理了。node
获取全部已安装的ROS软件包列表清单 rospack list
找到一个软件包的目录 rospack find package-name
查看软件包目录下的文件 rosls package-name
将当前目录切换至此软件包目录 roscd package-name
ROS 节点管理器 roscore
启动节点 rosrun package-name executable-name
查看节点列表 rosnode list
显式设置节点的名称 rosrun package-name executable-namec++
查看节点 rosnode info node-name
终止节点 rosnode kill node-name ctrl-c不会当即终止
查看节点之间的链接关系 rqt_graph
话题列表 rostopic list
打印消息内容 rostopic echo topic-name
测量发布频率 rostopic hz topic-name rostopic bw topic-name
查看话题 rostopic info topic-name
查看消息类型 rosmsg show message-type-name
用命令行发布消息 rostopic pub -r rate-in-hz topic-nameshell
建立工做区 mkdir -p ~/catkin_ws/src
建立功能包 进入src文件夹 catkin_create_pkg package-name数组
编写程序:bash
1.功能包文件夹中建立xxx.cpp文件
2.包含依赖库 #include <ros / ros.h>
每个消息类型 #include <package_name/type_name.h>
3.main函数中 ros::init 最后一个参数为节点默认名
4.ros::NodeHandle一个程序建立一个对象服务器
编译程序:
1.声明依赖库 (package-names roscpp)
CMakeLists.txt中 find_package(catkin REQUIRED COMPONENTS package-names)
package.xml中
<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>
2.声明可执行文件 CMakeLists.txt 中添加两行
add_executable(executable-name source-files)
target_link_libraries(executable-name ${catkin_LIBRARIES})
3.编译工做区 从工做区目录运行 catkin_make框架
4.source ~/catkin_ws/devel/setup.bash 每一个终端运行一次分布式
发布消息:
1.包含消息类型声明
#include <package_name/type_name.h>
2.建立发布者对象
ros::Publisher pub = node_handle.advertise<message_type>( topic_name, queue_size);
topic_name相对名称
同一个节点发布关于多个话题的消息,须要为每一个话题建立一个独立的 ros::Publisher 对象
建立一个发布者是一个很耗时的操做
3.建立并填充消息对象
4.发布消息
pub.publish(msg);
5.定义输出格式
ROS_INFO_STREAM函数
节点是否中止工做的检查 ros::ok()
控制消息发布频率 ros::Rate对象 ros::Rate rate(hz); rate.sleep();学习
订阅消息:
1.编写回调函数
void function_name(const package_name::type_name &msg)
{
. . .
}
2.建立订阅者对象
建立一个ros::Subscriber对象
ros::Subscriber sub = node_handle.subscribe (topic_name,queue_size, pointer_to_callback_function)
3.给ROS控制权
ros::spin() 这个方法要求 ROS 等待而且执行回调函数(阻塞方式)
ros::spinOnce()这个代码要求 ROS 去执行全部挂起的回调函数,而后将控制权限返回给咱们(非阻塞)
每个日志消息都被发布到话题/rosout 上。该话题的消息类型是rosgraph_msgs/Log
查看/rosout消息 rostopic echo /rosout rqt_console
设置某个节点的日志级别:
1.经过命令行设置日志级别 rosservice call /node-name/set_logger_level ros.package-name level
2.经过图形界面设置日志级别 rqt_logger_level
3.经过 C++代码设置日志级别
全局名称 前斜杠"/"
默认命名空间+相对名称=全局名称
为每一个节点设置默认命名空间(不设则使用"/")
1.ROS 程序 _ _ns:=default-namespace
2.环境变量为在 shell 内执行的 ROS 程序设置默认命名空间 Export ROS_NAMESPACE=default-namespace
3.启动文件 ns=”namespace(最经常使用)
私有名称 以一个波浪字符(~)开始
节点名+私有名称=全局名称
匿名名称 通常用于为节点命名 ros::init_options::Anonymous-Name 做为第四个参数传递给ros::init 方法
启动文件:
.launch 由一个包含若干节点元素(node elements)的根元素(root element)组成
执行启动文件 roslaunch package-name launch-file-name
每一个节点元素有以下三个必需的属性 pkg type name
在启动文件内使用一个匿名名称 name=”$(anon base_name)
在控制台中输出信息 output=”screen
令 roslaunch 在控制台中显示全部节点的输出 roslaunch -screen package-name launch-file-name
请求复位 respawn=”true 这样当节点中止的时候, roslaunch 会从新启动该节点
必要节点 required=”true 当一个必要节点终止的时候,roslaunch 会终止全部其余活跃节点并退出
为节点维护独立的窗口 Launch-prefix=“comman-prefix? launch-prefix=”xetr-e?
名称重映射
建立重映射
1.当使用命令行启动节点时 original-name := new-name
2.经过启动文件的方式 <remap from=”origina-name”to ”n-name”/>
怎样理解重映射?????
启动文件包含其余文件 <include file=”$(find packag-name)/launch-file-name”
声明参数 <arg name=”ag-name”>
参数赋值 roslaunch package-name launch-file-name arg-name:=arg-value
<arg name=”ar-name” default=”a-value”/ >
<arg name=”ar-name” value=”a-value”/ >
命令行参数能够覆盖默认值default,可是不能覆盖参数值value.由 value 设置的参数值是不能更改的
获取参数值 $(arg arg-name)
查看参数列表 rosparam list
查询参数 rosparam get parameter_name
检索给定命名空间中的每个参数的值 rosparam get namespace
设置参数 rosparam set parameter_name parameter_value
只有当节点的/clear服务被调用时,它才会从参数服务器读取这些参数的值 rosservice call /clear
使用c++获取参数 void ros::param::set(parameter_name, input_value);
bool ros::param::get(parameter_name, output_value);
在启动文件中设置参数 <param name="param-name" value="param-value" />
设置私有参数 在节点元素中包含param元素
服务调用是双向的,一个节点给另外一个节点发送信息并等待响应
服务调用实现的是一对一通讯
服务数据类型分为两部分,分别表示请求和响应
列出全部服务 rosservice list
查看某个节点的服务类型 rosnode info node-name
查找提供服务的节点 rosservice node service-name
查找服务的数据类型 rosservice info service-name
功能包名+类型名=服务数据类型
查看服务数据类型 rossrv show service-data-type-name
从命令行调用服务 rosservice call service-name request-content
一个服务的客户端程序:
1.声明请求和响应的类型 #include <package_name/type_name.h>
2.建立客户端对象 ros::ServiceClient client = node_handle.serviceClient<service_type>( service_name);
3.建立请求和响应对象 package_name::service_type::Request
package_name::service_type::Response
4.调用服务 bool success = service_client.call(request,reponse);
5.声明对定义服务类型的功能包的依赖
编辑CMakeLists.txt的find_package行和清单文件 packag.xml的build_depend、run_depend
服务器程序:
1.编写服务的回调函数,给 Response 对象的数据成员赋值
bool function_name(
package_name::service_type::Request &req),
package_name::service_type::Response &resp)
) {
...
}
2.建立服务器对象 (service_name局部名称)
ros::ServiceServer server = node_handle.advertiseService( service_name,pointer_to_callback_function);
编译单个或多个package catkin_make --pkg <package A> <package B>
建立自定义消息msg\srv文件 1.变量类型与名称之间只能用空格,不能用tab 2.数组能够不指定大小,代码中数组不能直接用{}赋值,用pushback或resize赋值,或逐个赋值