赞
踩
关于RoboWare Studio的下载,这里给出安装包的下载链接:
链接:https://pan.baidu.com/s/1ypCs18v26PW8Of3aOunDow
提取码:v2se
安装前提:
下载后将其移动到虚拟机内,打开文件系统,双击安装包就行了,遇到提示就按 Esc 就行了,CSDN上安装教程有很多,这里就不多赘述了。
至于我问什么要安装这个IDE呢?最最主要的原因就是,他可以自动修改CMakeList.txt与其他配置文件的设置,非常方便。
下载完成后在命令行输入:
roboware-studio
启动软件
① 根据如下图所示,打开对应语言设置文件。
② 将 "locale":"en"
,修改为 "locale":"zh-CN"
保存并重启系统,可以看到语言已经修改为中文了。
① 点击 文件,可新建工作区。
我这边已经有工作区了,就是上几节创建的 catkin_ws
,选择打开工作区就行了。
② 右击工作区下的 src
,可以选择 新建ROS包
。
③ 右击 新建的ROS包,可以为其添加依赖。
④ 右击新建包ROS 目录下 src 目录,可以新建CPP文件
新建的文件后,会弹出列表,选择 加入新的可执行文件中
,IDE工具则会根据CPP文件名创建一个与之同名的可执行文件(ROS节点),此时CMakeList.txt文件会自动更新。
① 修改上面的编译设置为 Debug。
② 点击小锤子,进行编译,效果与catkin_make
一样。
命令行输入:
sudo apt-get remove roboware-studio
可以卸载软件。
话题通信是ROS节点通信方式的一种,它是一对多、异步的通信,方式在上一节的内容讲过了。
这里不过赘述。
这里讲一下一些话题命令。
rostopic echo
:打印话题信息rostopic hz
: 话题频率rostopic info
:话题信息rostopic list
:列举话题rostopic pub
:往话题输入信息rostopic bw
: 话题带宽rostopic find
:从数据类型寻找话题rostopic type
:查看话题的数据类型上几节讲了节点的概念,在ROS中,最小的进程单位称为节点(Node)。每个节点都是一个可执行文件,可以是C++或Python文件,下面这里用C++代码来实现节点。
打开编辑器,右击ROS包目录下的src
,创建 PubForBeginner.cpp
,内容如下:
#include "ros/ros.h" #include "std_msgs/String.h" int main(int argc, char **argv) { //initial and name node ros::init(argc, argv, "publisher"); //create nodehandle ros::NodeHandle nh; //create publisher ros::Publisher simplepub = nh.advertise<std_msgs::String>("string_topic",100); ros::Rate rate(10); //message for publish std_msgs::String pubinfo; pubinfo.data = "Hello, I'm Publisher!"; while(ros::ok()) { simplepub.publish(pubinfo); } return 0; }
string_topic
的主题上发布类型为<std_msgs::String>的消息。打开编辑器,右击ROS包目录下的src
,创建 SubForBeginner.cpp
,内容如下:
#include "ros/ros.h" #include "std_msgs/String.h" using namespace std; void subCallback(const std_msgs::String& submsg) { string subinfo; subinfo = submsg.data; ROS_INFO("The message subscribed is: %s",subinfo.c_str()); } int main(int argc,char** argv) { //initial and name node ros::init(argc,argv,"subscriber"); //create nodehandle ros::NodeHandle nh; //create subscriber ros::Subscriber sub = nh.subscribe("string_topic",1000,&subCallback); ros::spin(); return 0; }
string_topic
上的消息,接收到消息后调用回调函数处理。① 首先点击编译。
编译失败,可以在 ②位置处寻找问题,如果是语法问题,编译器里会使用 红线 勾出。
② 打开一个终端输入:
roscore
③ 再分别打开两个终端,在两个终端分别输入下面的命令:
格式:rosrun 包名 cpp文件名(节点名)
rosrun pub_dis_02 SubForBeginner
rosrun pub_dis_02 PubForBeginner
④ 在 接收端可以看到实验结果:
⑤ 新建一个终端输入命令 rosrun rqt_graph rqt_graph
,可以查看节点间通信的通信关系。
根据上面的代码我们知道,发布与接收的消息需要遵循同一种类型,ROS系统已经帮我们定义了一些常用的数据类型。例如上面代码我们使用的。
当有些时候,当系统的消息类型无法满足我们的使用时,我们就需要自定义消息类型来使用。
这里重新建一个ROS包,来演示自定义消息类型。
① 我们又新建了一个ROS包,使用和上面相同的ROS包依赖。在 RoboWare Studio 中,右击ROS包,就可以创建 msg
文件夹,在msg创建自定义消息文件,格式为.msg
。或者可以直接敲命令进行创建。但自定义消息文件必须储存在msg文件夹内。
② 在msg
文件夹内创建 Student.msg
。文件名可以自定义。内容包含如下:
string name
float64 height
float64 weight
内容是:
③ 在创建了自定义类型后,需要在ROS包目录下修改以下内容(如果文件中已经修改了,就不管)
package.xml
文件修改:
CMakeLists.txt
文件修改:
message_generation
Message1
为你自己自定义msg文件名④ 点击编译,就可以在工作空间目录下,的devel目录下找到Student.h。我们使用自定义类型时,包含这个头文件就行了。
#include "ros/ros.h" #include "book_msg_03/Student.h" #include <cstdlib> using namespace std; int main(int argc, char **argv) { //initial and name node ros::init(argc, argv, "node_MsgPub"); if(argc != 4) { cout << "Error command parameter!\n"\ << "Please run command eg:\n"\ << "rosrun book_msg_03 Book_MsgPub name height weight" << endl; return -1; } //create node handle ros::NodeHandle nh; //create messge publisher ros::Publisher MsgPub = nh.advertise<book_msg_03::Student>("MyMsg", 100); book_msg_03::Student stdmsg; stdmsg.name = argv[1]; stdmsg.height = atof(argv[2]); stdmsg.weight = atof(argv[3]); ros::Rate rate(10); while(ros::ok()) { MsgPub.publish(stdmsg); rate.sleep(); } return 0; }
#include "ros/ros.h" #include "book_msg_03/Student.h" // custom defined message callback function void MsgCallback(const book_msg_03::Student &stdInfo) { ROS_INFO("The student information is:\n name:%s--height:%f--weight:%f", stdInfo.name.c_str(), stdInfo.height, stdInfo.weight); } int main(int argc, char *argv[]) { //initial and name node ros::init(argc, argv, "node_MsgSub"); //create node handle ros::NodeHandle nh; //create subscriber ros::Subscriber MsgPub = nh.subscribe("MyMsg" ,100, &MsgCallback); ros::spin(); return 0; }
类似之前的接收端程序,不过这里使用的是自定义的学生消息数据类型。
① 首先点击编译。
编译失败,可以在 ②位置处寻找问题,如果是语法问题,编译器里会使用 红线 勾出。
② 打开一个终端输入:
roscore
③ 再分别打开两个终端,在两个终端分别输入下面的命令:
格式:rosrun 包名 cpp文件名(节点名)
rosrun book_msg_03 Book_MsgSub
rosrun book_msg_03 Book_MsgPub xiaoming 180 74
④ 在 接收端可以看到实验结果:
⑤ 新建一个终端输入命令 rosrun rqt_graph rqt_graph
,可以查看节点间通信的通信关系。
到这里就结束啦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。