文章目录

  • 一、安装
  • 二、特点
  • 三、初步使用
    • 1、新建工作区(创建工作空间)
    • 2、构建(工作空间初始化)
    • 3、编译
    • 4、新建ROS包(创建功能包)
    • 5、配置功能包依赖
    • 6、添加节点文件
    • 7、编译及运行
    • 8、自定义消息
    • 9、编译及运行
  • 四、总结 

前言


RoboWare Studio是一个ROS集成开发环境.使ROS开发更加直观、简单,并且易于操作.可进行ROS工作空间及包的管理,代码编辑、构建及调试。可惜的是,目前已经停更。。。

一、安装

我使用的RoboWare Studio是roboware-studio_1.1.0-1514335284_amd64版本,deb文件已经上传到资源,roboware-studio_1.1.0-1514335284_amd64.deb,请自行下载。下载完成,双击即可完成安装,效果如下:

二、特点

  • 1、RoboWare Studio可自动检测并加载ROS环境,无需额外配置。
  • 2、兼容indigo、jade、kinetic等版本。
  • 3、以图形化的方式进行ROS工作区及包的创建、源码添加,message、service、action文件创建、显示包及节点列表。
  • 4、可实现CMakelists.txt文件和package.xml文件的自动更新。
  • 5、提供Release、Debug及Isolated编译选项。以界面交互的方式调试C++和Python代码,可设置断点、显示调用堆栈、单步运行,并支持交互式终端。可在用户界面展示ROS包和节点列表。
  • 6、可将本地代码部署到远程机器上,远程机器可以是X86架构或ARM架构。可在本地机器实现远程代码的部署、构建和实时调试。
  • 7、内置Git功能,使用更加简单。可在编辑器界面进行差异比对、文件暂存、修改提交等操作。可对任意Git服务仓库进行推送、拉取操作。
  • 8、从代码创建、消息定义,到文件存储路径的创建及选择等,RoboWare Studio会引导开发者进行符合ROS规范的操作,协助开发者编写高质量、符合规范的ROS包。

三、初步使用

1、新建工作区(创建工作空间)

在这里我新建了一个工作区robo_catkin_ws,和之前学习时创建的catkin_ws区分开。这一步操作相当于创建工作空间操作。


填写工作空间名,如下:


点击右下角的“保存”按钮,完成工作空间创建。

2、构建(工作空间初始化)

将资源管理器设置为release模式,在菜单中ROS选项中,点击构建,完成构建,相当于完成工作空间初始化。所以,这步操作相当于catkin_init_workspace操作,可以看到src目录下会多出一个 CMakeLists.txt 文件。

3、编译

在IDE下面控制台,可以看到终端一栏,输入如下命令,完成编译。

catkin_make

然后,将该工作空间的路径加入环境变量ROS_PACKAGE_PATH中,即将该工作空间下的devel中的setup.bash添加到主目录的.bashrc文件中。
依次输入如下命令:


gedit ~/.bashrc

source /home/zt/robo_catkin_ws/devel/setup.bash

4、新建ROS包(创建功能包)

点击src文件夹,鼠标右键,选择新建ROS包,输入功能包名字learning_topic,即可完成在工作空间的src目录下创建功能包。


可以看到该功能包下,自动生成了CMakeList.txt和package.xml文件。

5、配置功能包依赖

选中功能包,右键,选择“编辑依赖的ROS包列表”,如下:


在弹出来的配置栏处输入roscpp std_msgs,如下:

6、添加节点文件

右键点击learning_topic功能包,新建src文件夹,可以看到子文件中会生成src文件夹


右键点击src文件夹,新建cpp源文件:


命名为talker.cpp后,选择“加入到新的可执行文件中”:


同理命名listener.cpp,我们在文件目录可以看到,在得到两个文件的同时,RoboWare Studio也修改了CMakeList.txt和package.xml文件。
talker.cpp源码如下:

#include <ros/ros.h>
#include <geometry_msgs/Twist.h>

int main(int argc, char **argv)
{
    ros::init(argc, argv, "velocity_publisher");
     
    ros::NodeHandle n;
    
    ros::Publisher turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
	
    ros::Rate loop_rate(10);

    int count = 0;
	
    while(ros::ok())
    {
		geometry_msgs::Twist vel_msg;
		vel_msg.linear.x = 0.5;
		vel_msg.angular.z = 0.2;
		turtle_vel_pub.publish(vel_msg);
		ROS_INFO("Publish turtle velocity command [%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);
		loop_rate.sleep();
}
    return 0;
}

listener.cpp源码如下:

#include <ros/ros.h>
#include "turtlesim/Pose.h"

void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{
    ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "pose_subscriber");

    ros::NodeHandle n;

    ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);

    ros::spin();

    return 0;
}

7、编译及运行

在IDE下面控制台,打开新的终端,输入如下命令完成编译:

catkin_make

启动roscore,命令如下:

roscore

运行小乌龟节点,命令如下:

rosrun turtlesim turtlesim_node

运行talker节点,命令如下:

rosrun learning_topic talker

运行listener节点,命令如下:

rosrun learning_topic listener

8、自定义消息

右键点击learning_topic功能包,新建Msg文件夹


右键点击生成的msg文件夹,新建msg文件,命名为Person.msg


文件内容如下:

string name
uint8 sex
uint8 age

uint8 unknown = 0
uint8 male = 1
uint8 female = 2

如上所述,我们分别新建person_publisher.cpp和person_subscriber.cpp文件。

person_publisher.cpp文件内容如下:

#include <ros/ros.h>
#include "learning_topic/Person.h"

int main(int argc, char **argv)
{
	ros::init(argc, argv, "person_publisher");
	ros::NodeHandle n;
	
	ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
	ros::Rate loop_rate(1);
	int count = 0;
	while(ros::ok())
	{
		learning_topic::Person person_msg;
		person_msg.name = "Tom";
		person_msg.age = 18;
		person_msg.sex = learning_topic::Person::male;
		
		person_info_pub.publish(person_msg);
		ROS_INFO("Publish Person Info: name:%s  age:%d  sex:%d",
				  person_msg.name.c_str(), person_msg.age, person_msg.sex);
		loop_rate.sleep();
	}
	return 0;
}

person_subscriber.cpp文件内容如下:

#include <ros/ros.h>
#include "learning_topic/Person.h"

void personInfoCallback(const learning_topic::Person::ConstPtr& msg)
{
	ROS_INFO("Subscribe Person Info: name:%s  age:%d  sex:%d", msg->name.c_str(), msg->age, msg->sex);
}

int main(int argc, char **argv)
{
	ros::init(argc, argv, "person_subscriber");
	ros::NodeHandle n;
	ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
	ros::spin();
	return 0;
}

9、编译及运行

在IDE下面控制台,打开新的终端,输入如下命令完成编译:

catkin_make

启动roscore,命令如下:

roscore

运行person_subcriber节点,命令如下:

rosrun learning_topic person_subcriber


运行person_publisher节点,命令如下:

rosrun learning_topic person_publisher


同理,也可以完成自定义服务的实现。

四、总结

个人感觉,RoboWare Studio最大的方便之处在于,可实现CMakelists.txt文件和package.xml文件的自动更新,这大幅度的减少了配置工作。但其在使用过程中,有些地方仍需要我们手动输入命令完成,比如编译catkin_make、启动roscore或节点等。