ROS 学习备忘录 - 01 - 项目开发流程及基础通信编程

ROS通信编程-流程备忘

ROS 项目开发流程

备忘 ROS 的基础开发流程。时间:2020/08/17

一、工作空间和功能包
  1. 创建工作空间流程

    • 新建文件夹 $ mkdir ros_ws && cd ros_ws
    • 新建 ros_ws/src空间 $ mkdir src && cd src
    • 初始化ROS工作空间,注意在ros_ws/src下$ $ catkin_init_workspace
    • 编译工作空间,在根目录/ros_ws下执行$ catkin_make,自动搜索src下的所有功能包并编译。自动产生builddevel文件夹,build存放二进制文件,devel存放可执行文件位于devel/lib中。
    • 编译成功后,进行环境变量添加(临时) $ source devel/setup.zsh,我用的zshbash就替换为bash。查看当前ROS包环境变量,$ echo $ROS_PACKAGE_PATH,不用每次都source的方式是直接编辑~/.zshrc文件,在最后加入source /home/username/catkin_ws/devel/setup.zsh注意这里的路径用 pwd命令查看一下,要加入具体的username
    • 产生install文件夹,$ catkin_make install,内容几乎与devel相同。
  2. 创建功能包流程

    • src下创建功能包,命令格式:

      $ catkin_create_pkg <pkg_name> [depend1][depend2][depend3]

    • 返回工作空间下,进行编译 $ catkin_make,注意功能包不能重名。
    • 功能包与文件夹的区别,功能包必须含有 CMakelist.txtpackage.xml
二、Topic话题的发布和订阅实现
  1. ROS Topic话题通信,发布者实现流程

    • 初始化节点

      ros:: init(argc, argv, " [ node_name] ");

    • 创建节句柄

      ros:: NodeHandlenode;

    • Master注册节点信息,创建publisher,发布话题topic,定义话题的消息类型

      ros:: Publisherpub = node.advertise<[msg_type]>(" [topic_name] ", 1000);

    • 设置发布频率

      ros:: Rateloop_rate ( 单位Hz);

    • 进入循环发布,以ROS状态为循环条件:

      while (ros::ok())
      (1) 定义话题中信息数据,并赋值 ros::msg_typemsg;
      (2) 节点发布消息 pub.publish(msg);
      (3) 基于发布频率延迟发布 loop_rate.sleep();

  2. ROS Topic话题通信,订阅者实现流程

    • 初始化节点

      ros:: init(argc, argv, " [ node_name] ");

    • 创建节句柄

      ros:: NodeHandlenode;

    • Master注册节点信息,创建 subscriber,注册回调函数callback_func

      ros::Subscriber sub = node.subscribe([topic_name], 1000, callback_func);

    • 循环等待回调函数 ros::spin(); 死循环,不断查找队列数据。

    • 关键是回调函数的处理,基本定义可以是

      void chatterCallback(const [msg_type_pkg]::msg_type::ConstPtr& msg)
      {
      //do something
      }

  3. 配置编译规则并编译

    • 打开编写的pkg目录下的CMakelist.txt,加入两句话,一句是声明可执行文件 add_executable(<node_name> src/<node.cpp>)另一个是链接声明 target_link_libraries(node_name ${catkin_LIBRARIES})添加在 ##build后面。
    • 回到根目录,编译 catkin_make,100% 出现即为成功。
  4. 自定义消息类型实现

    • 在功能包下面创建 msg 文件夹,创建一个xx.msg,配置编译设置

      • 先改 package.xml, 加入

        <build_depend>message_generation</build_depend>
        <exec_depend>message_runtime</exec_depend>

      • 再改 CMakeLists.txt,在find_package中加入message_generation。在 ## Declare ROS messages中加入两行语句 add_message_files(FILES xxx.msg)
        generate_messages(DEPENDENCIES std_msgs)

      • ## catkin specific configuration ##中打开注释加入 message_runtime 改成CATKIN_DEPENDS roscpp rospy std_msgs std_srvs message_runtime

      • 回到根目录编译工作空间,自动在devel文件夹下动态产生的跟````.msg文件同名的.h```头文件,里面有一些类的定义。

    • 在程序中调用 自定义消息 【发布】节点, 主要注意与【二】【1】的区别,主流程完全一样,区别在于:

      • 头文件包含自动生成的.h文件
      • 注册master时需要使用自定义消息类型
      • 循环发布中对自定义消息类型进行赋值
      • 别忘了cmakelist.txt里面添加可执行和依赖库
      • 额外的添加动态依赖 add_dependencies(node_name ${${PROJECT_NAME}_gencpp)
    • 在程序中调用 自定义消息 【订阅】节点, 主要注意与【二】【2】的区别,主流程完全一样,区别在于:

      • 节点名字肯定要改
      • 主要是回调函数,接口改成自定义类型,然后里面也要操作自定义类型的数据。
      • 额外的添加动态依赖
  5. 话题通信到此结束。

三、Service服务的发布和订阅实现
  1. 在话题中是一直发一直收,在服务中是请求后才发送。服务的服务端实现流程:

    • 节点初始化

    • 节点句柄定义

      ros::NodeHandle n;

    • matster注册一个服务节点

      ros::ServiceServer service = n.advertiseService(“node_name”, callback_func);

    • 定义服务端的回调函数

      • 针对需求req和回复res的具体实现,是否成功服务了。

      bool print(std_srvs::SetBool::Request &req, std_srvs::SetBool::Response &res){ }

    • 直接进入循环,没有缓冲区设置。

  2. 客户端实现流程

    • 节点初始化

    • 节点句柄定义

      ros::NodeHandle n;

    • matster注册一个服务节点,定义向哪一个服务发送请求,利用标准服务来个例子。

      ros::ServiceClient client = n.serviceClient<std_srvs::SetBool>(“node_name”);

    • 创建 service 消息,赋值服务的变量。

    • 发布 service 请求,等待应答结果。

    • 配置 cmakelist.txt 中可执行和链接库,编译工作空间即可。

  3. 自定义服务信息的实现流程

    • 在功能包中建立srv子文件夹,然后在其中建立自定义的.srv文件,格式为上下两部分,用 【---】 分割,上面的部分是服务中的req请求的内容,下面是res回复的内容。

    • serverclient 中的数据流向,其实是这个意思,服务端可以理解是一个处理中心,客户端是向服务端发送数据和请求,服务端接受数据并进行处理然后返回客户端,这就是req和res定义的变量,和服务端的回调函数所进行的功能,这个过程就像网络游戏,玩家在自己电脑上按鼠标键盘,服务端处理后再发回玩家这里进行更新。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值