初识ROS机器人操做系统

  最近因工做须要,学习了一下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赋值,或逐个赋值

相关文章
相关标签/搜索