1. 程式人生 > >簡單的程式碼讓turtlebot動起來 直行與旋轉

簡單的程式碼讓turtlebot動起來 直行與旋轉

之前都是使用鍵盤控制turtlebot的行走,於是想寫段程式碼可以讓turtlebot自己動起來,畢竟今後的工作是想讓機器人在地圖上可以實現自行路徑規劃到達指定的目的地。

啟動turtlebot後在命令列敲入rostopic list我們可以看到當前所有的topic,如下圖

我們在使用鍵盤控制turtlebot的時候用到的時候cmd_vel這一個topic,然而在上圖中我們並沒有發現它。經過一番查閱和對比,在官方程式碼 kobuki_keyop/launch/keyop.launch檔案中可以看到<remap from="keyop/cmd_vel" to="mobile_base/commands/velocity">,把keyop/cmd_vel對映到了mobile_base/commands/velocity上,而這個topic是有的。所以為了實現我們用程式碼控制turtlebot的想法,就需要我們向該topic發一個型別為geometry_msgs/Twist型別的訊息,本訊息中要包含運動的線速度和角速度。

分析正確後實現起來就簡單多了。

首先建立程式包

catkin_create_pkg turtle_move roscpp geometry_msgs tf

下面是程式碼部分,在turtle_move/src中建立move_turtle_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("move_turtle_goforward ended!");
  ros::shutdown();
}
int main(int argc, char** argv)
{
  ros::init(argc, argv, "move_turtle_goforward");//初始化ROS,它允許ROS通過命令列進行名稱重對映
  ros::NodeHandle node;//為這個程序的節點建立一個控制代碼
  cmdVelPub = node.advertise<geometry_msgs::Twist>(/mobile_base/commands/velocity, 1);//在/mobile_base/commands/velocity topic上釋出一個geometry_msgs/Twist的訊息
  ros::Rate loopRate(10);//ros::Rate物件可以允許你指定自迴圈的頻率
  signal(SIGINT, shutdown);
  ROS_INFO("move_turtle_goforward cpp start...");
  geometry_msgs::Twist speed; // 控制訊號載體 Twist message
  while (ros::ok())
  {
    speed.linear.x = 0.1; // 設定線速度為0.1m/s,正為前進,負為後退
    speed.angular.z = 0; // 設定角速度為0rad/s,正為左轉,負為右轉
    cmdVelPub.publish(speed); // 將剛才設定的指令傳送給機器人
    loopRate.sleep();//休眠直到一個頻率週期的時間
  }
  return 0;
}

旋轉也是同理,僅僅需要把線速度設為0,角速度設為0.5即可。


回到上層,在CMakeList.txt檔案的末尾加上兩句:

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

編譯一下敲入

catkin_make

 我使用的模擬環境

roslaunch turtlebot_gazebo turtlebot_world.launch

 再執行我們寫好的move_turtle_goforward程式

rosrun turtle_move move_turtle_goforward