ROS学习笔记

本文介绍了ROS(RobotOperatingSystem)的基本使用,包括命令行工具(如rosnode,rostopic等)的操作,工作空间的创建与功能包的构建,以及如何定义和使用话题消息、发布者和订阅者,以及launch文件的使用。
摘要由CSDN通过智能技术生成

1.ros命令行使用

  • rosnode 

    rosnode list  列出节点信息

    rosnode info + 节点      打印节点信息

  • rostopic 

        list 查看话题

        echo 查看话题内容

  • rosmsg

        与发布的话题消息相关的内容

  • rosservice

        服务相关内容

  • rosbag

        数据记录:rosbag record -a -O 压缩的数据包名

        数据复现:rosbag display 压缩的数据包名

2.工作空间及功能包的创建

 工作空间:

  • src:      代码空间
  • build: 编译空间
  • devel:开发空间
  • install:  安装空间

创建工作空间步骤:

1.创建工作空间:
  • mkdir -p  ~/工程文件名/src

  • cd ~/工程文件名/src

  • catkin_init_workspace

2.编译工作空间
  • cd ~/工程文件名/
  • catkin_make
3.设置环境变量
  • source devel/setup.bash

创建功能包步骤:

1.创建功能包
  • cd ~/工程文件名/src
  • catkin_create_pkg 功能包名字   依赖1std_msgs   依赖2rospy   依赖3roscpp
2.编译功能包
  • cd ~/工程文件名
  • catkin_make
  • source devel/setup.bash
  • 或者在终端输入(该方法只需要输入一次)
    echo “source ~/工程名/devel/setup.bash” >> ~/.bashrc
3.编译规则

在工程名/src/功能包下的CMakeLists.txt中修改

###########
## Build ##
###########


include_directories(
include
  ${catkin_INCLUDE_DIRS}
)



#在该板块的最下方

# 将程序文件编译成可执行文件
add_executable(可执行文件名 src/程序文件名1.cpp src/程序文件名2.cpp)    
# 可执行文件依赖catkin库
target_link_libraries(可执行文件名 ${catkin_LIBRARIES})

#如果要使用自定义的消息需要添加   可执行文件与动态生成的程序产生依赖关系
add_dependencies(可执行文件名 ${PROJECT_NAME}_generate_messages_cpp)

3.话题消息、发布者、订阅者

1.话题消息

  • 定义.msg文件  位置放在 功能包文件名/msg文件夹下
    string name
    uint8 sex
    uint8 age
    uint8 class
  • 在package.xml中添加编译与执行功能依赖包   语法置于最下方的<export>上方
    <build_depend>message_generation</build_depend>  
    <exec_depend>message_runtime</exec_depend>
    
  • 在CMakeLists.txt中添加编译选项
    find_package(catkin REQUIRED COMPONENTS
      roscpp
      rospy
      std_msgs
      #添加依赖
      message_generation
    )
    ################################################
    ## Declare ROS messages, services and actions ##
    ################################################
    #该板块的最下方
    
    add_message_files(FILES 文件名.msg)  #编译该文件
    generate_messages(DEPENDENCIES std_msgs) #编译时依赖的功能包
    ###################################
    ## catkin specific configuration ##
    ###################################
    
    catkin_package(
    #  INCLUDE_DIRS include
    #  LIBRARIES test_package
    CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
    #  DEPENDS system_lib
    )

    编译完使用时包含路径及头文件     

  • 定义变量

    #include"功能包名/头文件名.h"
    
    
    功能包名::头文件名  变量名;
    
    
    变量名.成员;

2.发布者

#include<ros/ros.h>
#include<功能包名/头文件名.h> //数据类型
int main(int argc, char**argv)
{
    ros::init(argc,argv,"节点名称"); //初始化节点,一般一个节点就是一个进程代表一个功能
    ros::NodeHandle n; //创建节点句柄
    ros::Publisher pub = n.advertise<消息类型>("话题名","10"); //10为队列长度

    ros::Rate loop_rate(10); //设置循环频率

    //定义一个数据变量
    功能包名::头文件名  变量名;

    while(ros::ok())
    {
     //功能包名::头文件名::变量名   
        std_msgs::Float64MultiArray 变量名;
        变量名.data.resize(3);
     //封装数据
        变量名.data[0] = 值;
     //发布数据
        pub.publish(变量名);
     //按照设定频率循环
        loop_rate.sleep();
     //循环等待回调函数  如果队列中有数据就会直接进入回调函数,没有数据会接着执行其他程序,不会阻塞
        ros::spinOnce();
    }

     
}

3.订阅者

#include<ros/ros.h>
#include<功能包名/头文件名.h> //数据类型

//订阅者的回调函数  接收到数据后进入回调函数解析数据
void sub_callback( 功能包名::头文件名::ConstPtr &变量名)
{
     变量 = 变量名.date[0];   
}
 

int main(int argc, char**argv)
{
    ros::init(argc,argv,"节点名称"); //初始化节点,一般一个节点就是一个进程代表一个功能
    ros::NodeHandle n; //创建节点句柄
    ros::Subscriber sub = n.subscribe("话题名", 10, sub_callback);
    ros::spin();//等待回调函数  如果队列中有数据就会直接进入回调函数,队列没有数据也会一直等待,直到队列有数据后再次进入回调函数,不会执行其他程序。若想执行其他程序使用ros::spinOnce()搭配while循环
}

4.launch文件

  • 启动节点

    <launch>
        <node pkg="节点所在功能包名称" type="节点可执行文件名称" name="节点运行时名称” output="screen" launch-prefix = "gnome-terminal -e"/>
    </launch>
  • 参数设置

    ##把launch文件中的一些参数直接设置到rosmaster(ros中的节点管理器)
    #设置单个参数
    <param name="参数名" value="参数值"/>
    #加载参数文件中的多个参数
    <rosparam file="$(find yalm文件所在的功能包名)/文件名/参数文件名.yaml" command="load"/>
    
    
    ##launch脚本内部使用的参数键值对
    <arg name="参数名" default="参数值"/>
    #调用
    <param name = "名字" value = "$(arg 参数名)"/> #上面arg的键值对
    <node name = "名字" pkg = "package" type="type" args ="$(arg 参数名)" />
    
  • 重映射

    <remap from="原名字" to="新名字"/>
  • 嵌套

    #file 其他launch文件的路径
    <include file="$(find launch功能包名)/launch/文件名.launch"/>
     
  • launch文件的使用步骤

    • cd ~/工程文件名/src
    • catkin_create_pkg    launch功能包名字   
    • cd ~/工程文件名/src/launch功能包名字 
    • mkdir -p  launch
    • 编写lauch文件
    • roslaunch  launch功能包名字  文件.launch

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值