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

本来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函数被调用了。

推荐阅读更多精彩内容