感觉官网不太好进,把roboware-studio_1.1.0-1514335284_amd64.deb文件放上网盘了。
链接:https://pan.baidu.com/s/1SImF07-xgyUaQfEoMBr5Rw 提取码:x3zc
cd到安装包的父目录下或者用终端打开,输入解压安装命令:
sudo dpkg -i roboware-studio_1.1.0-1514335284_amd64.deb
如果遇到下面这个问题
Package libgconf-2-4 is not installed
这是由于依赖错误,输入命令自动安装缺少依赖:
sudo apt-get -f -y install
重新运行下面的命令:
sudo dpkg -i roboware-studio_1.1.0-1514335284_amd64.deb
安装完成后,在终端直接在终端输入打开软件:
roboware-studio
下面的内容适合于已经看过B站《古月ros入门21讲》前面11讲的内容的小伙伴,因为古月老师是教我们手动利用gedit修改CMakeList.txt和package.xml的,这里采用roboware环境,会自动完成修改,这样可以专注于编程与调试。
1、基本工作区创建文件选项栏下选择新建工作区,这里工作区名字为ros_21_review
将资源管理器设置为release模式,ros选项栏下点击构建,这个操作相当于是catkin_init_workspace操作,如下图是已经完成工作空间的构建了,生成了CMakeList文件的结果。
右击src选择 新建ROS包
命名为learning_topic回车,发现自动生成了CMakeList.txt和package.xml
3、配置功能包依赖添加ros包依赖,右键点击 编辑依赖的ros包列表 ,
在弹出的配置栏处输入roscpp std_msgs,这个操作在古月老师的视频中也是需要手动在CMakeList.txt中添加的。
4、添加节点文件talker.cpp和listener.cpp右击learning_topic功能包,选择 新建src文件夹
在子文件中生成src文件,右击src文件选择 新建cpp源文件
命名为talker.cpp后选择 加入到新的可执行文件中
同理命名listener.cpp,得到两个文件的同时,roboware也修改了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;
}
快捷键 ctrl + ` 调起终端,在工作空间下编译:
catkin_make
为了避免每次输入ros指令前输入source /devel/setup.bash,将该工作空间下的devel中的setup.bash添加到主目录的.bashrc文件中(ctrl+h显示隐藏文件)
5、测试talker和listener(1)打开roscore:
roscore
(2)运行小海龟节点:
rosrun turtlesim turtlesim_node
(3)运行talker节点:
rosrun learning_topic talker
(4)运行listener节点:
rosrun learning_topic listener
三、测试learning_topic功能包(下)
1、自定义消息
右击learning_topic功能包,选择 新建Msg文件夹
右击生成的msg文件夹,选择 新建MSG文件,命名为Person.msg
将下面的具体结构定义复制进去
string name
uint8 sex
uint8 age
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
2、添加节点文件person_publisher.cpp和person_subscriber.cpp
同talker.cpp的方法生成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;
}
如下图所示:
在工作空间下编译:
catkin_make
3、测试person_publisher.cpp和person_subscriber.cpp
(1)启动roscore:
roscore
(2)运行person_subcriber节点:
rosrun learning_topic person_subcriber
(3)运行person_publisher节点:
rosrun learning_topic person_publisher