练习通过主题发送消息:
—— 关于ros提到的那只turtle
(一)背景
关于ROS的资料中,提到一只虚拟小乌龟:turtle,关于它的例子也十分简单,比如启动它:
roscore
rosrun turtlesim turtlesim_node
另打开一个ternimal标签
rosrun turtlesim turtle_teleop_key
将会得到蓝色背景下随机的一直小乌龟,并且可以使用方向键控制移动,但是turtle_teleop_key的节点系统里是没有源代码的,只有一个能够直接运行的文件.
打开节点图可以更直观地看到这两个节点间传递消息的主题
rqt_graph
-
显然,/teleop_turtle这个节点单向传递速度的控制信息给turtlesim节点, 那么完全可以按照程序的意愿是小乌龟的运行处于脱机运行状态.
换句话说自己写一个可发布/turtle1/cmd_vel的程序.
(二)简单的自转
我们必须知道/turtle1/cmd_vel里发布的msg是什么样的:
$rostopic type /turtle1/cmd_vel | rosmsg show
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
可以看到msg为geometry_msgs/Vector3,这个消息的原型在ROS中,/opt/ros/版本/share/geometry_msgs/Vector3 ,内容为
float64 x
float64 y
float64 z
-
那么接下来自己写一个node,发布它们就可以了.
-
在catkin中建立一个package,并创建一个node.
cd ~/catkin_ws/src/子目录
catkin_create_pkg 节点名 roscpp rosmsgs geometry_msgs
在该package的src下创建一个名为talk.cpp的node.
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
ros::Publisher cmdVelPub;
int main(int argc, char **argv){
ros::init(argc, argv, "talk");
//"talk"必须是nodename
std::string topic = "/turtle1/cmd_vel"; //topic name
ros::NodeHandle n;
cmdVelPub = n.advertise<geometry_msgs::Twist>(topic, 1);
//第一个参数也可以写成"/turtle1/cmd_vel"这样的topic name
//第二个参数是发布的缓冲区大小,<geometry_msgs::Twist>是消息类型
ros::Rate loopRate(2);
//与Rate::sleep();配合指定自循环频率
ROS_INFO("talk cpp start...");//输出显示信息
geometry_msgs::Twist speed; // 控制信号载体 Twist message
while (ros::ok()){
speed.linear.x = 1; // 设置线速度为1m/s,正为前进,负为后退
speed.angular.z = 1; // 设置角速度为1rad/s,正为左转,负为右转
cmdVelPub.publish(speed); // 将刚才设置的指令发送给机器人
ros::spinOnce();
loopRate.sleep();//按loopRate(2)设置的2HZ将程序挂起
}
return 0;
}
并且修改cmake代码,让编译系统明白如何编译,这里我的package为toldturtle,node为talk.cpp:
cmake_minimum_required(VERSION 2.8.3)
project(toldturtle)
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
)
catkin_package(
CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs
)
include_directories(
${catkin_INCLUDE_DIRS}
)
## Declare a C++ executable
add_executable(talk src/talk.cpp)
## Specify libraries to link a library or executable target against
target_link_libraries(talk
${catkin_LIBRARIES}
)
这样在terminal里编译下整个catkin的package
cd ~/catkin_ws/
catkin_make
如果编译成功,就可以看到提示了.
(三)效果
在终端运行写的node
rosrun toldturtle talk
这样就完成了,ros中这个简单的turtle的控制.
这样依然可以用方向键控制自旋转的turtle.
转载请注明出处.