美文网首页我爱编程
ROS学习笔记-3 RoboWare的使用和简单的发布话题

ROS学习笔记-3 RoboWare的使用和简单的发布话题

作者: 逆旅ROS | 来源:发表于2018-01-20 15:07 被阅读0次

    本来ROS学习笔记-2 应该已经写完了,是关于cartographer的尝试

    第一次成功跑了一遍,但是后来再运行的时候又出了点问题,于是决定找找问题再修改一下。

    这篇的内容主要是包括RoboWare的使用和简单的发布Twist消息

    1.RoboWare

    RoboWare是国人开发的一个ROS系统IDE,最大的好处就是可以方便代码和CMAKE文件,免去了繁琐的编译和编辑CMAKE文件过程。

    安装非常简单,在官网下载deb包,通过GDebi安装即可

    http://www.roboware.me/#/home

    RoboWare界面

    2.简单的介绍一下我了解到的RoboWare里面比较贴心的功能

    2.1新建好一个Catkin_Ws文件夹后,你可以右键选择添加新的ROS包,在ROS包下,可以自行选择创建src,launch文件夹等

    2.2 这个IDE在代码编辑的时候,和其他的IDE一样,都有补全功能和debug的功能

    2.3左上角的绿色小锤子可以一键编译,并且CMAKE也是自动生成的。

    2.4上方菜单有很多小功能,如启动roscore等等

    。。。。

    3.使用RoboWare实现简单的话题发布和订阅

    我学的过程里,主要是先学了ROS官方WIKI里的教程

    http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

    编写简单的消息发布器和订阅器 (C++)

    学习了一下关于节点(node)以及话题(topic)的内容

    再学习案例做了一个简单的发布器和订阅器

    然后再学了一些关于Twist消息的内容

    Twist消息,它的Topic是/cmd_vel,base controler订阅Twist消息来控制电机。

    在终端中执行以下指令查看Twist消息的具体内容:

    rosmsgshowgeometry_msgs/Twist

    一切正常的话,终端会输出以下信息。

    其中有linear和angular两个子消息,可以唯一确定机器人的运动状态。

    3.1编写一个控制turtlesim的发布器

    我们知道,安装ROS后,会有一个自带的turtlesim可以模拟,也就是那只小海龟,通过小海龟,可以完成ROS系统的部分功能,于是我就在turtlesim上试验twist消息的发布和接受。

    首先,只编写一个发布器,广播给turtlesim

    再RoboWare里创建一个新的package,名字为beginner_tutorials(和ROS教程内相同,不改了)

    在src文件夹下创建一个talker.cpp的文件

    #include "ros/ros.h"

    #include "std_msgs/String.h"

    #include

    #include

    int main(int argc, char **argv)

    {

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

      ros::NodeHandle n;

      ros::Publisher chatter_pub = n.advertise("/turtle1/cmd_vel", 1000);

      ros::Rate loop_rate(10);

      int count = 0;

      while (ros::ok())

      {

        geometry_msgs::Twist msg;

        msg.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退

        msg.angular.z = 1; // 设置角速度为1rad/s,正为左转,负为右转

        chatter_pub.publish(msg);

        ros::spinOnce();

        loop_rate.sleep();

      }

      return 0;

    }

    代码内重要的部分:

    1 ros::Publisher chatter_pub = n.advertise("/turtle1/cmd_vel", 1000);

    定义一个publisher类的对象,其中advertise内的参数为(话题,发布的缓冲区大小)

    2 geometry_msgs::Twist msg;

    定义一个twist类的消息对象

    msg.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退

    msg.angular.z = 1; // 设置角速度为1rad/s,正为左转,负为右转

    设置对象的参数

     3 chatter_pub.publish(msg);

    通过刚才创建的publisher对象发布刚才创建的twist类对象

    这样执行完上面的代码,我们就可以将复制好linear和angular参数的twist对象广播出去,广播的topic是/turtle1/cmd_vel,也就是turtlesim会自动订阅的topic

    我们来测试一下

    点击小锤子,把代码编译一下

    首先,启动ros

    roscore

    然后,启动turtlesim

    rosrun turtlesim turtlesim_node

    然后,source一下

    source ./devel/setup.bash

    然后,执行刚刚的cpp文件

    rosrun beginner_tutorials talker

    然后可以看一下结果

    turtlesim,也就是图上的小乌龟,会绕圆循环移动。

    发成了发布器的编写,趁热打铁,再写一个订阅器,订阅器其实只需要设置接受的topic即可

    首先在src文件夹内创建一个listener的cpp文件

    代码如下

    #include "ros/ros.h"

    #include "std_msgs/String.h"

    #include

    void chatterCallback(const geometry_msgs::Twist& msg)

    {

        ROS_INFO("Start");

        ROS_INFO_STREAM(std::setprecision(2) << std::fixed << "linear.x=("<< msg.linear.x<<" msg.angular.z="<<msg.angular.z);

    }

    int main(int argc, char **argv)

    {

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

      ros::NodeHandle n;

      ros::Subscriber sub = n.subscribe("chatter",1000, chatterCallback);

      ros::spin();

      return 0;

    }

    这里,我们定义了一个chatter的话题,我们通过这个话题,来接受来自广播的chatter话题内容,然后执行chatterCallback函数

    接收到广播后,执行函数chatterCallback

    函数的作用是返回收到的twist消息里的参数

    这里还需要把talker文件里的话题改一下

    #include "ros/ros.h"

    #include "std_msgs/String.h"

    #include

    #include

    int main(int argc, char **argv)

    {

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

      ros::NodeHandle n;

      ros::Publisher chatter_pub = n.advertise("chatter", 1000);

      ros::Rate loop_rate(10);

      int count = 0;

      while (ros::ok())

      {

        geometry_msgs::Twist msg;

        msg.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退

        msg.angular.z = 1; // 设置角速度为1rad/s,正为左转,负为右转

        chatter_pub.publish(msg);

        ros::spinOnce();

        loop_rate.sleep();

      }

      return 0;

    }

    然后,我们测试一下

    同样的启动ROS

    roscore

    source一下

    source ./devel/setup.bash

    rosrun beginner_tutorials talker

    rosrun beginner_tutorials listener

    分别在两个terminal内执行talker和listener文件

    可以看到返回了twist消息的参数,打印出了“Start”也证明了chatterCall函数被调用了。

    相关文章

      网友评论

        本文标题:ROS学习笔记-3 RoboWare的使用和简单的发布话题

        本文链接:https://www.haomeiwen.com/subject/iultaxtx.html