一、在ubuntu18.04虛擬機上安裝roboware
感覺官網不太好進,把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

二、測試learning_topic功能包(上)
下面的內容適合於已經看過B站《古月ros入門21講》前面11講的內容的小伙伴,因為古月老師是教我們手動利用gedit修改CMakeList.txt和package.xml的,這里采用roboware環境,會自動完成修改,這樣可以專注於編程與調試。
1、基本工作區創建
文件選項欄下選擇新建工作區,這里工作區名字為ros_21_review
將資源管理器設置為release模式,ros選項欄下點擊構建,這個操作相當於是catkin_init_workspace操作,如下圖是已經完成工作空間的構建了,生成了CMakeList文件的結果。
2、創建功能包learning_topic
右擊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