筆者根據 古月居 · ROS入門21講 學習整理,並參考《ROS機器人開發實踐》一書。
相關課件及源碼可參考 Github/huchunxu/ros_21_tutorials
RoboWare Studio IDE
- 安裝
- 爲支持 Python 相關功能,需要安裝 pylint。
$ sudo apt-get install python-pip
$ sudo python -m pip install pylint
- 爲支持 clang-format 相關功能,需要安裝 clang-format-3.8 或更高版本。
$ sudo apt-get install clang-format-3.8
- 在 Github/TonyRobotics/RoboWare 下載 RoboWare Studio 最新版,雙擊.deb文件即可。
- 爲支持 Python 相關功能,需要安裝 pylint。
- 由於Github下載單一文件較爲複雜,筆者在此提供個人倉庫便於讀者下載 RoboWare Studio 1.2.0,該倉庫中包含amd64(64位)、i386(32位)的deb文件以及CHS、EN的中英文使用手冊pdf文件。另可通過
git clone [email protected]:ME-Msc/RoboWare_Studio_1.2.0.git
進行下載。
編程實現話題發佈者Publisher
- 點擊 “新建工作區” 創建新工作空間
catkin_ws
- 右鍵點擊 ROS 工作區下的 “src” ,選擇 “新建ROS包” ,輸入包名稱及其依賴包的名稱
learning_topic roscpp rospy std_msgs geometry_msgs turtlesim
,回車後,會創建名爲 “learning_topic” 、以 “roscpp” 、“rospy”、“std_msgs”、“geometry_msgs”和“turtlesim” 爲依賴的 ROS 包。 - 右鍵點擊 catkin_ws/src/learning_topic/src 文件夾,點擊 “新建CPP源文件” 輸入文件名
velocity_publisher
,點擊回車鍵彈出列表,選擇 “加入到新的可執行文件中” ,則會創建一個與cpp文件同名的可執行文件(ROS節點)。此時CMakeLists.txt文件會自動更新下述三條編譯規則:add_executable(velocity_publisher src/velocity_publisher.cpp)
:描述將某個cpp文件編譯成相應的可執行文件add_dependencies(velocity_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
:添加cmake庫的目標依賴項target_link_libraries(velocity_publisher ${catkin_LIBRARIES})
:將可執行文件與ROS的庫進行鏈接
- 編輯 velocity_publisher.cpp 文件如下。
/**
* 該例程將發佈turtle1/cmd_vel話題,消息類型geometry_msgs::Twist
*/
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
int main(int argc, char **argv)
{
// ROS節點初始化
ros::init(argc, argv, "velocity_publisher");
// 創建節點句柄
ros::NodeHandle n;
// 創建一個Publisher,發佈名爲/turtle1/cmd_vel的topic,消息類型爲geometry_msgs::Twist,隊列長度10
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類型的消息
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("Publsh turtle velocity command[%0.2f m/s, %0.2f rad/s]", vel_msg.linear.x, vel_msg.angular.z);
// 按照循環頻率延時
loop_rate.sleep();
}
return 0;
}
- 點擊“文件-首選項-設置”,選擇“ROS”,修改構件工具爲“catkin_make”,並關閉保存。
- 在主界面左上角,修改資源管理器旁的構建方式爲“Debug”,並點擊小錘子進行構建。
- 在主界面左下角“ROS節點-learning_topic-velocity_publisher”,即可進行調試、運行、配置參數等。
- 點擊主界面上方“ROS-運行roscore”
- 在主界面右側下方點擊“+”創建新終端,輸入
$ rosrun turtlesim turtlesim_node
啓動小海龜仿真器。 - 在主界面左下角“ROS節點-learning_topic-velocity_publisher”,點擊“運行文件”,使得海龜按照代碼進行運動。
編程實現話題訂閱者Subscriber
- 右鍵點擊 catkin_ws/src/learning_topic/src 文件夾,點擊 “新建CPP源文件” 輸入文件名
pose_subscriber
,點擊回車鍵彈出列表,選擇 “加入到新的可執行文件中” 。 - 編輯 pose_subscriber.cpp 文件如下。
/**
* 該例程將訂閱/turtle1/pose話題,消息類型turtlesim::Pose
*/
#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節點
ros::init(argc, argv, "pose_subscriber");
// 創建節點句柄
ros::NodeHandle n;
// 創建一個Subscriber,訂閱名爲/turtle1/pose的topic,註冊回調函數poseCallback
ros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
// 循環等待回調函數
ros::spin();
return 0;
}
- 在主界面左上角,修改資源管理器旁的構建方式爲“Debug”,並點擊小錘子進行構建。
- 點擊主界面上方“ROS-運行roscore”
- 在主界面右側下方點擊“+”創建新終端,輸入
$ rosrun turtlesim turtlesim_node
啓動小海龜仿真器。 - 在roboware外創建新終端,輸入
$ rosrun turtlesim turtle_teleop_key
啓動鍵盤控制節點。因爲後續需要在RoboWare中運行pose_subscriber,不能同時運行鍵盤控制,所以不適用RoboWare內置的終端。 - 在主界面左下角“ROS節點-learning_topic-pose_subscriber”,點擊“運行文件”,接收海歸位置信息並打印在主界面下方“調試控制檯”中。