这两天在学习movebase的一些内容,不得不感概movebase的体系是很庞大的。下面我用turtlebot3完成了movebase中goal的实现。即使零基础都可以做出来,内容不多但肯定能实现。下图是效果图:
现在我们在终端下执行这个命令:
sudo apt-get install turtlebot3-*
然后在设置环境变量:
echo "export TURTLEBOT3_MODEL=burger" >> ~/.bashrc
source ~/.bashrc
在两者环境变量中选一个export TURTLEBOT3_MODEL=burger或者export
TURTLEBOT3_MODEL=waffle
此时便可以在终端下输入:
roslaunch turtlebot3_gazebo turtlebot3_world.launch
再在另一个终端输入:
roslaunch turtlebot3_gazebo turtlebot3_world.launch
现在我们可以加入关于movebase的c++小程序了。代码如下:
#include <ros/ros.h>
#include <move_base_msgs/MoveBaseAction.h> //move_base的操作规范,这是一个将高级别接口暴露在导航堆栈中的 ROS 操作。
#include <actionlib/client/simple_action_client.h>
typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient;
//简单操作操作创建方便的键入字,使我们能够与粘附在 MoveBase 行动操作界面的操作进行通信。
int main(int argc, char** argv){
ros::init(argc, argv, "simple_navigation_goals");
MoveBaseClient ac("move_base", true); // //构建一个操作客户端,我们将用它来与坚持 MoveBase 行动界面的名为"move_base"的操作进行通信。它还告诉行动客户端启动一个线程来调用 ros::spin(),以便通过传递"真实"作为 MoveBase 客户端构造的第二个参数来处理 ROS 回调。
while(!ac.waitForServer(ros::Duration(5.0))){
ROS_INFO("Waiting for the move_base action server to come up");
} //等待操作服务器报告它已出现并准备开始处理目标
move_base_msgs::MoveBaseGoal goal;
goal.target_pose.header.frame_id = "base_link";
goal.target_pose.header.stamp = ros::Time::now();
goal.target_pose.pose.position.x = 1.0;
goal.target_pose.pose.orientation.w = 1.0;
ROS_INFO("Sending goal");
ac.sendGoal(goal); //在这里,我们创建一个目标,使用move_base_msgs发送给move_base::移动BaseGoal消息类型,该消息类型自动包含在移动基础操作.h标题中。我们只需告诉基地在"base_link"坐标框架中向前移动1米。呼叫ac.sendGoal实际上会通过电线将目标推送到move_base节点进行处理。
ac.waitForResult();
if(ac.getState() == actionlib::SimpleClientGoalState::SUCCEEDED)
ROS_INFO("Hooray, the base moved 1 meter forward");
else
ROS_INFO("The base failed to move forward 1 meter for some reason"); //现在唯一要做的就是等待目标使用ac.等待目标完成,等待目标完成,这将阻止,直到完成move_base操作处理我们发送的目标。完成后,我们可以检查目标是否成功或失败,并相应地向用户输出消息。
return 0;
}
现在这个cpp文件写好了,加上依赖并写一个launch文件就可以用了。依赖项如下:
add_executable(simple_navigation_goals src/simple_navigation_goals.cpp)
target_link_libraries(simple_navigation_goals ${catkin_LIBRARIES})
加在CMakeLists里。