本来ROS学习笔记-2 应该已经写完了,是关于cartographer的尝试
第一次成功跑了一遍,但是后来再运行的时候又出了点问题,于是决定找找问题再修改一下。
这篇的内容主要是包括RoboWare的使用和简单的发布Twist消息
1.RoboWare
RoboWare是国人开发的一个ROS系统IDE,最大的好处就是可以方便代码和CMAKE文件,免去了繁琐的编译和编辑CMAKE文件过程。
安装非常简单,在官网下载deb包,通过GDebi安装即可
http://www.roboware.me/#/home
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
一切正常的话,终端会输出以下信息。
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函数被调用了。