天天看點

ROS第一個程式:機器人直行和旋轉

系統版本:Ubuntu14.04,ROS indigo

機器人底盤:kobuki

攝像頭:Asus Xtion

一、功能介紹

  編譯兩個簡單程式,一個是機器人直行,另一個是原地旋轉。

二、實驗步驟

1.建立程式包

catkin_create_pkg robot_move roscpp geometry_msgs tf
           

2.在robot_move/src/裡建立goforward.cpp,并粘貼如下代碼:

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

ros::Publisher cmdVelPub;

void shutdown(int sig)
{
  cmdVelPub.publish(geometry_msgs::Twist());//使機器人停止運動
  ROS_INFO("goforward cpp ended!");
  ros::shutdown();
}

int main(int argc, char** argv)
{
  ros::init(argc, argv, "GoForward");//初始化ROS,它允許ROS通過指令行進行名稱重映射
  std::string topic = "/cmd_vel";
  ros::NodeHandle node;//為這個程序的節點建立一個句柄
  cmdVelPub = node.advertise<geometry_msgs::Twist>(topic, );//告訴master将要在/cmd_vel topic上釋出一個geometry_msgs/Twist的消息
  ros::Rate loopRate();//The desired rate to run at in Hz,ros::Rate對象可以允許你指定自循環的頻率
  // Override the default ros sigint handler. This must be set after the first NodeHandle is creat
  signal(SIGINT, shutdown);
  ROS_INFO("goforward cpp start...");
  geometry_msgs::Twist speed; // 控制信号載體 Twist message
  while (ros::ok())
  {
    speed.linear.x = ; // 設定線速度為0.1m/s,正為前進,負為後退
    speed.angular.z = ; // 設定角速度為0rad/s,正為左轉,負為右轉
    cmdVelPub.publish(speed); // 将剛才設定的指令發送給機器人
    loopRate.sleep();//休眠直到一個頻率周期的時間
  }

  return ;
}


           

3.在robot_move/src/裡建立goincircles.cpp,将goforward.cpp的源代碼複制到goincircles.cpp

将speed.linear.x設定為0,speed.angular.z設定為0.4,其它不變。

4.修改robot_move目錄下的CMakeLists.txt

在CMakeLists.txt檔案末尾加入幾條語句:

add_executable(goforward src/goforward.cpp)
target_link_libraries(goforward ${catkin_LIBRARIES})

add_executable(goincircles src/goincircles.cpp)
target_link_libraries(goincircles ${catkin_LIBRARIES})
           

整個CMakeLists.txt檔案如下:

cmake_minimum_required(VERSION )
project(robot_move)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  tf
  roscpp
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES robot_move
  CATKIN_DEPENDS geometry_msgs roscpp
#  DEPENDS system_lib
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
# include_directories(include)
include_directories(
  ${catkin_INCLUDE_DIRS}
)

add_executable(goforward src/goforward.cpp)
target_link_libraries(goforward ${catkin_LIBRARIES})

add_executable(goincircles src/goincircles.cpp)
target_link_libraries(goincircles ${catkin_LIBRARIES})
           

5.編譯程式

在catkin_ws目錄下,執行一下指令編譯:

catkin_make –force-cmake -G”Eclipse CDT4 - Unix Makefiles” -DCMAKE_BUILD_TYPE=Debug -DCMAKE_ECLIPSE_MAKE_ARGUMENTS=-j8

得到goforward和goincircles兩個執行程式。

為何不直接執行catkin_make編譯?因為執行指令也可以讓Eclipse識别該工程,友善在Eclipse編寫調試代碼。執行過一次,以後隻需catkin_make編譯,Eclipse也能識别。

6.測試程式

6.1 啟動roscore

roscore
           

6.2 啟動機器人

6.2.1若是運作仿真機器人
6.2.2若是運作真實的機器人平台

6.3 啟動 rviz 圖形化顯示程式,如圖1

ROS第一個程式:機器人直行和旋轉

圖1

6.4 啟動goforward程式,如圖2

rosrun robot_move goforward
           
ROS第一個程式:機器人直行和旋轉

圖2

6.5 Ctrl+C結束goforward程式,再測試goincircles程式,如圖3

rosrun robot_move goincircles
           
ROS第一個程式:機器人直行和旋轉

圖3

源代碼:https://github.com/KeoChi/robot_move

個人學習筆記,歡迎交流學習。