赞
踩
本文实现通过代码发送控制命令给机器人,让机器人安装特定的轨迹行走.希望实现的功能为直走和走一个圆形.
roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch
此时如果启动键盘控制的话机器人就可动起来了。
为了用代码控制机器人运动,需要将键盘控制程序替换为自定义的程序。
roslaunch turtlebot3_slam turtlebot3_slam.launch
rostopic list 发现控制命令是通过cmd_vel发送的。
rostopic echo /cmd_vel 可看到命令形式如
linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
先让机器人转圈,输入这个命令
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: -0.5}}'
让机器人直行,输入
rostopic pub -r 10 /cmd_vel geometry_msgs/Twist '{linear: {x: 0.1, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0}}'
新建一个节点不断发送/cmd_vel 控制机器人运动的节点
mkdir -p cmdveltest/src
cd cmdveltest/src
catkin_create_pkg cmdveltest geometry_msgs
mkdir src
cd src
touch cmdveltest.cpp
cd cmdveltest/src
catkin_make
在CMakeLists.txt中加入
add_executable(cmdveltest src/cmdveltest.cpp)
target_link_libraries(cmdveltest ${catkin_LIBRARIES})
cmdveltest.cpp内容如下
#include <iostream>
#include <geometry_msgs/Twist.h>
#include <ros/ros.h>
#include <ros/console.h>
#include<unistd.h>
using namespace std;
int main(int argc,char** argv)
{
ros::init(argc, argv, "cmdveltest");
ros::NodeHandle cmdh;
ros::Publisher cmdpub= cmdh.advertise<geometry_msgs::Twist>("cmd_vel", 1, true);;
ros::Rate r(60);
while(1){
geometry_msgs::Twist twist;
geometry_msgs::Vector3 linear;
linear.x=0.1;
linear.y=0;
linear.z=0;
geometry_msgs::Vector3 angular;
angular.x=0;
angular.y=0;
//直行
//angular.z=0;
//转圈
angular.z=-0.5;
twist.linear=linear;
twist.angular=angular;
cmdpub.publish(twist);
cout<<"hello"<<endl;
// ros::spinOnce();
//r.sleep();
sleep(1);
}
return 0;
}
编译后启动gazebo,启动测试程序
rosrun cmdveltest cmdveltest
发现机器人跑得飞起
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。