• 第四课4、ROS客户端


    ROS客户端提供一些列库文件用于用户开发。它利用许多ROS概念并使它通过代码可以获取。

    下面是ROS程序中的接口

    ROSCPP客户端(c++客户端)

    首先新建一个包

    然后catkin_make一下

    在新建的包目录下,建立一个消息文件msg

    上面定义的消息需要生成消息的头文件foo.h以便以后我们可以调用,我们进入package.xml里面去修改,

    第一步:

    第二步:

    然后再回到CMakeLists.txt中

    完成之后,下面编译一下,

    下面来写一下代码:

    我们以前已经写过了make文件,查看一下

    有了这个文件,我们就可以在eclipse中打开这个工程,先执行一下这个文件:

    下面打开eclipse

    然后file->import,

    下面要在src中写一个源文件,叫做move_publisher.cpp

    再写一个move_subscriber.cpp

    首先要控制turtlesim,他的话题topic是/turtle1/cmd_vel(rostopic list);消息类型为geometry_msgs/Twist(rostopic info /turtle1/cmd_vel)

    下面编写发布程序

    /*  * move_publisher.cpp  *

     *  Created on: Jan 16, 2017

     *      Author: gary  */

    #include<ros/ros.h> //消息的头文件

    #include<geometry_msgs/Twist.h>

    //一定要加命令行参数,argc指参数个数

    //argv为具体的参数

    int main(int argc,char **argv)

    {  

    //初始化,move_publisher为节点名称

     ros::init(argc,argv,"move_publisher");  

    //定义一个句柄  

    ros::NodeHandle n;  

    //定义一个发布者类ros::Publisher的对象pub,指定需要的消息类型为geometry_msgs::Twist

     //发布的主题为turtle1/cmd_vel,缓冲区大小为1000 ,advertise返回一个publisher类型的对象。

    ros::Publisher pub=n.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",1000);  

    //实例化一个消息对象  

    geometry_msgs::Twist tw;  

    //并对它进行赋值,分别是角速度赋值

    tw.angular.z=2;  

    tw.angular.x=0;  

    tw.angular.y=0;  

    //线速度赋值  

    tw.linear.x=2;

     tw.linear.y=0;  

    tw.linear.z=0;

     //上面消息结构已经定义了,下面发布这个消息  

    //指定发布频率,允许循环频率当前是10HZ,

     ros::Rate rate(10);    

    while(ros::ok())  //ros::ok()这个句柄如果按下ctrl+c则它会返回一个false值

    {   //指定要发布的消息   

    pub.publish(tw);   

    //spin()是指在此处固定等待消息,进入循环

      //spin_once()循环一次执行回调函数  

     ros::spin(); //要改成ros::spinOnce()才能正确运行,然后就一直处于新欢内,消息是没有办法发送出去的。

     }

     rate.sleep();

    }

    下面修改一下CMakeLists.txt,

    添加一行

    add_executable(move_publisher src/move_publisher.cpp)

    以及

    target_link_libraries(move_publisher
       ${catkin_LIBRARIES}
     )

    保存一下,下面来编译,

    catkin_make,编译正确后,运行一下

    rosrun turtle_move move_publisher

     下面再写一个订阅者:

    把刚刚的消息加到订阅者里面来(#include<turtle_move/foo.h>),也把发布者和接收者写到一起

    回调函数里面要传递一个参数,且用的一个共享指针ConstPtr(他是boost的一个共享指针)在这里如果用eclipse继承开发环境的话还可以跟进具体变量的类型是什么!!!!!!

    下面的话题foo_topic是可以随便指定的,只要里面的数据类型turtle_move::foo是已经定义过的就行。

    消息文件里面的定义格式如下:

    数据类型  变量名,例如:int16  foo

    然后修改CMakeLists.txt

    加入以下:

    add_executable(move_subscriber src/move_subscriber.cpp)

    target_link_libraries(move_publisher
       ${catkin_LIBRARIES}
     )

    再进行编译

    catkin_make,没有问题,之后运行之,正确,发布和接收都在同一个文件;可以在循环里面加上foo.foo++;来体现是在进行消息的正确发布。

    下面再写一个计时器,在src下新建一个文件:

    类似于创建一个主题订阅

    上面使用n.createTimer创建了一个时间对象,Duration(1)就是一个时间区间为1s。ros::spin()是等待消息。

    然后在CMakeLists.txt里面再修改,

    添加上

    add_executable(timer src/timer.cpp)

    target_link_libraries(timer
       ${catkin_LIBRARIES}
     )

    然后编译正确,然后运行,结果也是正确的。

  • 相关阅读:
    移除HTML5 input在type="number"时的上下小箭头
    JQUERY 实现加入收藏夹功能
    发现移动端在uc浏览器上会放大bug,解决此bug的方法!
    HTML 定时页面跳转
    Some Commands I Used Frequently
    Some Life Tricks I Noticed
    几种工厂模式的区别
    大型DELETE(删除大量数据)的一种解决方案
    笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-10 可编程对象
    笔记-Microsoft SQL Server 2008技术内幕:T-SQL语言基础-09 事务和并发
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6291225.html
Copyright © 2020-2023  润新知