1:安装仿真包
sudo apt-get install ros-$ROS_DISTEO-stdr-simulator
2:运行
roslaunch stdr_launchers server_with_map_and_gui_plus_robot.launch
//该包的话题名为/robot0/cmd_vel
3:查看话题
rostopic info /robot0/cmd_vel
可以看到消息的类型以及订阅者
4:查看消息类型
rosmsg show geometry_msgs/Twist
5:控制机器人行走
(1)终端输入命令 rostopic pub -r 3 /…
(2) 代码控制
代码如下:
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
//node to send Twist commands to the Simple 2-Dimensional Robot Simulator via cmd_vel
int main(int argc, char **argv) {
ros::init(argc, argv, "stdr_commander");
ros::NodeHandle n; // two lines to create a publisher object that can talk to ROS
ros::Publisher twist_commander = n.advertise<geometry_msgs::Twist>("/robot0/cmd_vel", 1);
//some "magic numbers"
double sample_dt = 0.01; //specify a sample period of 10ms
double speed = 1.0; // 1m/s speed command
double yaw_rate = 0.5; //0.5 rad/sec yaw rate command
double time_3_sec = 3.0; // should move 3 meters or 1.5 rad in 3 seconds
geometry_msgs::Twist twist_cmd; //this is the message type required to send twist commands to STDR
// start with all zeros in the command message; should be the case by default, but just to be safe..
twist_cmd.linear.x=0.0;
twist_cmd.linear.y=0.0;
twist_cmd.linear.z=0.0;
twist_cmd.angular.x=0.0;
twist_cmd.angular.y=0.0;
twist_cmd.angular.z=0.0;
ros::Rate loop_timer(1/sample_dt); //create a ros object from the ros “Rate” class; set 100Hz rate
double timer=0.0;
//start sending some zero-velocity commands, just to warm up communications with STDR
//初始化
for (int i=0;i<10;i++) {
twist_commander.publish(twist_cmd);
loop_timer.sleep();
}
//向前走3m
twist_cmd.linear.x=speed; //command to move forward
while(timer<time_3_sec) {
twist_commander.publish(twist_cmd);
timer+=sample_dt;
loop_timer.sleep();
}
//逆时针旋转90度
twist_cmd.linear.x=0.0; //stop moving forward
twist_cmd.angular.z=yaw_rate; //and start spinning in place
timer=0.0; //reset the timer
while(timer<time_3_sec) {
twist_commander.publish(twist_cmd);
timer+=sample_dt;
loop_timer.sleep();
}
//向前走3m
twist_cmd.angular.z=0.0; //and stop spinning in place
twist_cmd.linear.x=speed; //and move forward again
timer=0.0; //reset the timer
while(timer<time_3_sec) {
twist_commander.publish(twist_cmd);
timer+=sample_dt;
loop_timer.sleep();
}
//顺时针旋转90度
twist_cmd.angular.z=-0.5;
twist_cmd.linear.x=0;
timer=0.0; //reset the timer
while(timer<time_3_sec) {
twist_commander.publish(twist_cmd);
timer+=sample_dt;
loop_timer.sleep();
}
//向前走3m
twist_cmd.angular.z=0.0; //and stop spinning in place
twist_cmd.linear.x=speed; //and move forward again
timer=0.0; //reset the timer
while(timer<time_3_sec) {
twist_commander.publish(twist_cmd);
timer+=sample_dt;
loop_timer.sleep();
}
//halt the motion
twist_cmd.angular.z=0.0;
twist_cmd.linear.x=0.0;
for (int i=0;i<10;i++) {
twist_commander.publish(twist_cmd);
loop_timer.sleep();
}
//done commanding the robot; node runs to completion
}
注:包可以自己建立,然后添加依赖项,roscpp以及geometry/Twist
ros中的单位都是国际化的,例如m/s,千克,rad/s等。
0.1rad/s 运行15s,相当于1.5rad大约90度。
可以看到运行节点后,机器人的初始状态以及最终状态。
红色代表仿真激光射线,绿色代表仿真的声纳信号。