之前都是使用鍵盤控制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
其中關於roscpp的官方解釋是:
roscpp is a C++ implementation of ROS. It provides a client library that enables C++ programmers to quickly interface with ROS Topics, Services, and Parameters. roscpp is the most widely used ROS client library and is designed to be the high-performance library for ROS.
下面是代碼部分,在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
啟動機器人,這裡我用的是kobuki
roslaunch kobuki_node minimal.launch
再運行我們寫好的move_turtle_goforward程式
rosrun turtle_move move_turtle_goforward
搞定。就可以看到turtlebot直行了,鍵盤按CTRL+C結束程式讓turtlebot停下。
最後感謝騰哥的指導。