关于ros提到的那只turtle

练习通过主题发送消息:

—— 关于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.

转载请注明出处.

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值