ROS實踐手冊(三) RoboWare實現learning_topic編程實驗

筆者根據 古月居 · 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文件即可。
  • 由於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”,點擊“運行文件”,使得海龜按照代碼進行運動。
    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”,點擊“運行文件”,接收海歸位置信息並打印在主界面下方“調試控制檯”中。pose_subscriber
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章