ROS操作系统基本命令汇总

五迷三道 提交于 2019-12-15 01:05:19
  • 【1】在使用ROS发布或者订阅消息之前,必须要使用命令roscore将这个ROS内核启动才行;
  • 【2】当编写好相关文件之后,一定要返回到ROS工程目录下,进行编译,具体操作是:
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash
  • 【3】当使用roscd 语句提示:无法找到相应的ros包的时候,采用
    echo "export ROS_PACKAGE_PATH"=~/ <文件名> /:"$ROS_PACKAGE_PATH " >> ~/.bashrc
    问题就可以得到解决
  • 【4】一般而言,一个ROS工作空间包括:
    -(1)src 文件夹: 一般包括ROS包(launch文件+msg文件+src文件+srv文件+头文件)+CMakeLists.txt文件+package.xml文件
    -(2)build 文件夹:用来存放编译过程的文件
    -(3)devel 文件夹:用来存放目标文件(如setup.bash)
    ROS文件空间的基本组成
    在这里插入图片描述
    ROS包的基本组成
    在这里插入图片描述
  • 【5】node是ROS操作系统中的最小单位,当我们需要打开多个node节点的时候会,我们必须采用master来进行管理。
roscore   //表示启动ros的master节点
  • 【6】rosrun语句的基本命令格式为:
$ rosrun pkg_name  node_name   //表示的是运行某个包中的节点
  • 【7】下图详细展示了如何查看rosnode的相关信息:
    在这里插入图片描述
  • 【8】launch文件:通常我们需要开启很多个节点(Node)才能实现机器人某个功能(如摄像头采集信息,处理信息,对这些信息做出相应判断等),这时我们就直接使用roslaunch命令来实现这个过程:
$ roslaunch pkg_name  file_name.launch

该文件的编写规则遵循:xml文件的编写格式。
在这里插入图片描述
【9】在ROS系统中,通信方式是其核心概念,主要包括四种方式:topic主题,service服务,parameter service参数服务器,actionlib动作库
(1)详细介绍topic类型的通信方式:是一种单向、异步,实时的、多对多的通信方式,一般有一个publisher和多个subscriber。
(2)常见的topic操作指令包括:
在这里插入图片描述
(3)详细介绍Message的通信结构:
在这里插入图片描述 类似于结构体类型的变量
基本的操作命令包括:
在这里插入图片打发打发发达
【10】Service的通信模式:
是一种双向的通信模式,而且是同步进行的。当Node A 发布请求之后,会在与原地等待reply,直到Node B处理完 请求并且完成了reply之后,Node A 才会继续执行相关操作。
在这里插入图片描述
其基本的操作指令包括:
在这里插入图片描述
注意,由于service具有反馈的过程,因此在进行文件(srv)定义的时候,需要区别对待,一般的格式为:
在这里插入图片描述
其基本的指令包括:
在这里插入图片描述
最后,当我们完成了msg或者srv等相关信息的模式定义之后,我们都需要对CMakelist.txt的编译文件和package.xml文件进行修改,使得其依赖或者包文件能够编译通过,生成对应的头文件。

【11】整个ROS包文件的分层结构图如下所示:
在这里插入图片描述
【12】roscpp文件位于ros包文件目录下的src文件夹中,一般包括以下几个部分:
在这里插入图片描述
【13】topic在roscpp中的应用:基本的步骤如下:
-(1)创建一个msg,并且要规定msg的内容;
-(2)注意在程序编译的时候需要“message_generation”,在程序运行的时候,需要“message_runtime”,因此我们需要打开package.xml,在文件中加入:
在这里插入图片描述
然后我们再打开CMakelists.txt然后再加入:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果想要直接返回ros的基本工作空间,可以直接使用如下语句:

$ cd ../..

-(3)创建一个publisher文件:(注意是在src文件夹下)

#include “ros/ros.h”  //必须引入这个头文件
#include "std_msgs/String.h"   //采用标准的信息库包
#include <sstream>   //标准的信息输出流

int main(int argc, char **argv)
{
  ros::init(argc,argv,"talker");    //初始化,并且创建一个节点名字
  ros::Nodehandle n;   //创建一个句柄
  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter",1000);     //创建一个publisher,并且往chatter这个topic上发送消息
  ros::Rate loop_rate(10);    //定义发布的频率
  int count = 0;
  while(ros::ok())  //如果ros还没有关闭
  {
   std_msgs::String msg;
   std::stringstream ss;
   ss<<"hello world"<<count;  //把count数值和hello world分别给ss
   msg.data=ss.str();     
   ROS_INFO("%s",msg.data.c_str());   //在窗口上打印出来
   chatter_pub.publisher(msg);   //发布这个消息
   ros::spinOnce();  //如果需要回调函数,则必须使用这个spinOnce()函数
   loop_rate.sleep();  //表示10Hz频率发布,而不是一直发布
   ++count;
   }
  return 0;
}

-(4)创建一个subscriber函数:(注意是是在src文件夹下)

#include "ros/ros.h"
#include "std_msgs/String.h"

void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
  ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
   ros::init(argc,argv,"listener");
   ros::NodeHandle n;
   ros::Subscriber sub = n.subscribe("chatter",1000,chatterCallback) ;
   ros::spin();   //表示进入循环,一直在chatter的topic上订阅消息
   return 0;
}

-(5)修改编译文件:CMakeLists.txt
在这里插入图片描述
最后要编译整个工作空间:

# In your catkin workspace
$ cd ~/catkin_ws
$ catkin_make
$ source ~/catkin_ws/devel/setup.bash  //更新
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!