摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/

1.0.本教程教你写实际的ros程序,控制自己的机器人。采用的是PC端的ubuntu+ros。终端为了能够使用低成本的里程计 ,陀螺仪 ,加速度计,超声波等传感器,采用STM32控制器。两者通过串口通信,交互数据。所有代码都有认真学习的必要。前提是你以经在ros.wiki或者书本上了解了ros 下的 话题,消息,节点等名词。

2.0.由于ros官方采用tuitlesim仿真器,我们再次也按照这种方式进行。首先在ros工作空间中创建自己的功能包:

catkin_creat_pkg zxwtest_package std_msgs rospy roscpp(功能包依赖std_msgs rospy roscpp)

然后在zxwtest_package/src下创建一个hello_node.cpp

2.1.修改catkin_make所需的编译选项配置。通过vim或者自己喜欢的编辑器打开zxwtest_package目录下的CMakeLists.txt文件,加载自己的编译选项,修改过后如下:

add_executable(hello_node src/hello.cpp)
target_link_libraries(hello_node ${catkin_LIBRARIES})

2.2.现在就要开始写代码了。一个属于自己的ros代码。

vim  hello_node.cpp

代码如下:代码比较简单 希望各位认真消化

#include "ros/ros.h"    //添加ros核心的头文件
#include "geometry_msgs/Twist.h" //包含geometry_msgs::Twist消息头文件
#include <stdlib.h> int main(int argc,char** argv)
{
ros::init(argc,argv,"publish_zhouxuewei"); //初始化ros节点
ros::NodeHandle node_handle; ros::Publisher pub = node_handle.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", );
ros::Rate loop_rate();
while(ros::ok()){
geometry_msgs::Twist msg;
msg.linear.x = double(rand())/double(RAND_MAX); //给消息中的变量赋值
msg.angular.z = *double(rand())/double(RAND_MAX)-;
pub.publish(msg); //发布消息
ROS_INFO_STREAM("Sending random velocity command!"); //ros可调式日志输出
loop_rate.sleep();
}
}

2.3.编译代码:到你的工作空间的顶层目录下:

catkin_make

如果没有错误就一切正常,你也会看到相应的输出:

 Built target hello_node 

2.4.测试代码:(此程序正如你所看到的会产生-1到1之间的随机数,控制turtlesim移动)

roscore
rosrun turtlesim turtlesim_node
rosrun zxwtest_package hello_node

查看节点 框图:

rqt_graph

3.0.下面教你如何订阅节点在话题上发布的消息,下面的代码订阅了turtle1/Pose话题上的消息。并用ros日志输出。

3.1.在zxwtest_package/src新建listen_node.cpp

代码如下:

#include <ros/ros.h>
#include <turtlesim/Pose.h>
#include <iomanip> void poseMessageReceived(const turtlesim::Pose& msg)
{
ROS_INFO_STREAM(std::setprecision() << std::fixed << "position=("<< msg.x <<","<< msg.y <<")" <<" *direction="<<msg.theta); } int main(int argv,char** argc)
{
ros::init(argv,argc,"listener_pose");
ros::NodeHandle node_Handle;
ros::Subscriber sub = node_Handle.subscribe("turtle1/pose",,&poseMessageReceived);
ros::spin();
return ;
}

3.2.编译代码。首先还是要修改编译属性,通过vim或者自己喜欢的编辑器打开zxwtest_package目录下的CMakeLists.txt文件,加载自己的编译选项,修改过后如下:

add_executable(listen_node src/listen_node.cpp)
target_link_libraries(listen_node.cpp ${catkin_LIBRARIES})

到你的工作空间的顶层目录下:

catkin_make

如果没有错误就一切正常,你也会看到相应的输出:

 Built target listen_node

3.3.测试代码:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teteop_key
rosrun zxwtest_package listen_node

当你通过键盘控制节点控制turtlrsim时,相应的输出如下:

查看节点 框图:

rqt_graph

4.0.以下程序在ros机器人当中应用非常多,pc端通过串口下发数据到终端执行。我们订阅/turtle1/cmd_vel话题上的turtlesim移动的角速度和线速度信息,下发到我们的机器人上,让他也跟着turtlesim通过键盘控制移动。

4.1.在zxwtest_package/src新建send_serial_node.cpp

代码如下:

#include <ros/ros.h>
#include "geometry_msgs/Twist.h"
#include <iomanip>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h> void Serial_Send_Data(const geometry_msgs::Twist& msg)
{
int i,fd,iRet;
struct termios options_old, options;
char buf[]; buf[] = (char)msg.linear.x;
buf[] = (char)msg.angular.z; printf("buf[0] = %d\n",buf[]);
printf("buf[1] = %d\n",buf[]); fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
if (fd < ) {
printf("[%s-%d] open error!!!\n", __FILE__, __LINE__);
}
fcntl(fd, F_SETFL, ); /*********************************************************/
tcgetattr(fd, &options);
options_old = options; options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/
options.c_oflag &= ~OPOST; /** 选择原始输出 **/ /*** Set the new options for the port... **/
tcsetattr(fd, TCSANOW, &options);
/*********************************************************/ iRet = write(fd, &buf,sizeof(buf));
if (iRet < ) {
printf("[%s-%d] write error!!!\n", __FILE__, __LINE__);
} tcsetattr(fd, TCSANOW, &options_old);
close(fd);
} int main(int argv,char** argc)
{
ros::init(argv,argc,"serial_send");
ros::NodeHandle node_Handle;
ros::Subscriber sub = node_Handle.subscribe("/turtle1/cmd_vel",,&Serial_Send_Data);
ros::spin();
return ;
}

4.2.编译代码。首先还是要修改编译属性,通过vim或者自己喜欢的编辑器打开zxwtest_package目录下的CMakeLists.txt文件,加载自己的编译选项,修改过后如下:

add_executable(send_serial_node src/send_serial_node.cpp)
target_link_libraries(send_serial_node.cpp ${catkin_LIBRARIES})

到你的工作空间的顶层目录下:

catkin_make

如果没有错误就一切正常,你也会看到相应的输出:

 Built target send_serial_node

4.3.测试代码:

roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teteop_key
rosrun zxwtest_package send_serial_node

将你的电脑和你的机器人通过串口连接,在键盘控制节点终端移动机器人,pc端输出如下:

机器人端收到数据后也相应移动。

查看节点 框图:

rqt_graph

监听turtlesim仿真器,发送数据到实际的机器人--20的更多相关文章

  1. vue 如何在循环中 "监听" 的绑定v-model数据

    vue 如何在循环中 "监听" 的绑定v-model数据 阅读目录 vue 如何在循环中 "监听" 的绑定v-model数据 1. 普通属性的值进行监听 2. ...

  2. 监听localStorage中的数据变化

    问题描述:我们在js里面获取了某一个localstorage的值,但是后期它可能改变了,我们js只执行一遍没办法再次获取它的值,当然可以刷新页面获取,但如果是我们的但页面就不能刷新页面了,此时:我们可 ...

  3. angular 使用rxjs 监听同级兄弟组件数据变化

    angular 的官网给出了父子组件之间数据交互的方法,如ViewChild.EventEmitter 但是如果要在同级组件之间进行数据同步,似乎并没有给出太多的信息. 有时候我们想,在一个组件中修改 ...

  4. elk监听Java日志发送微信报警

    一年前写过logstash根据日志关键词报警 ,今年重温一下.并且记录一下遇到的问题解决办法. Java错误日志一般出现一大坨,如下图: 所以我们的filebeat日志收集器就要改成多行匹配模式,以日 ...

  5. mac 下使用wireshark监听网络上的数据

    分三个步骤:    1.wireshark安装        wireshark运行需要mac上安装X11,mac 10.8的系统上默认是没有X11的.先去http://xquartz.macosfo ...

  6. vue watch深度监听对象,实现数据联动

    当对象内的某一个元素发生变化,判断对象另一元素,并进行赋值 <template> <input type="text" v-model="a.a1.a1 ...

  7. linux网络连接的查看和端口的监听

    网络软件都是由客户端和服务端组成,由服务端在服务器上监听指定的端口处理接收到的数据,而客户端是向服务器端监听的端口发送数据,并由服务器端对该数据进行处理,然后将处理结果返回给客户端. 那么我们在lin ...

  8. Android开发笔记(11)——DialogFragment & 点击监听

    转载请注明:http://www.cnblogs.com/igoslly/p/6931519.html DialogFragment使用 & 点击监听 /* DialogFragment是用于 ...

  9. Android 监听ContentProvider的数据改变

    今天介绍一下怎么监听ContentProvider的数据改变,主要的方法是:getContext().getContentResolver().notifyChange(uri,null),这行代码是 ...

随机推荐

  1. javaNIO是什么?由那几部分组成?各部分的作用。

    Java NIO 由以下几个核心部分组成: Channels Buffers Selectors 虽然Java NIO 中除此之外还有很多类和组件,但在我看来,Channel,Buffer 和 Sel ...

  2. Android安全之WebViewUXSS漏洞

    Android安全 WebView UXSS app开发 漏洞分析 移动安全 0X01 前言 XSS是我们比较熟悉的一种攻击方式,包括存储型XSS.反射型XSS.DOM XSS等,但UXSS(通用型X ...

  3. iphone/ipod网页开发教程及规则

    侦测iPhone/iPod 开发特定设备的移动网站,首先要做的就是设备侦测了.下面是使用Javascript侦测iPhone/iPod的UA,然后转向到专属的URL. if((navigator.us ...

  4. (转) function与感叹号

    原文:http://blog.sina.com.cn/s/blog_775f158f01016j12.html function与感叹号(转)(2012-08-29 12:29:12) 最近有空可以让 ...

  5. (转)Eclipse “cannot be resolved to a type” error

    原:http://www.cnblogs.com/xuxm2007/archive/2011/10/20/2219104.html Eclipse “cannot be resolved to a t ...

  6. A​n​d​r​o​i​d​ ​B​l​u​e​t​o​o​t​h​详​解(Android英文文档相关译文)

    一.Bluetooth Android平台包含了对Bluetooth协议栈的支持,允许机器通过Bluetooth设备进行无线数据交换.应用框架通过Android Bluetooth API访问Blue ...

  7. linux下vi命令

    Vi共分三种模式,分别是“一般模式”.“编辑模式”与“命令行命令模式”. 1.一般模式:vi处理文件时,一进入该文件就是一般模式.在这个模式中,可以使用“上下左右”键来移动光标,可以使用“删除字符”或 ...

  8. Unity3D ShaderLab压缩混合纹理贴图

    Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...

  9. HDU 4054

    http://acm.hdu.edu.cn/showproblem.php?pid=4054 模拟题,对一个字符串的每个字符输出16进制表示的数字,每行处理16个字符,后面再把这16个字符输出,大小写 ...

  10. 联合与枚举 、 高级指针 、 C语言标准库(一)

    1 输入一个整数,求春夏秋冬 1.1 问题 在实际应用中,有的变量只有几种可能取值.如人的性别只有两种可能取值,星期只有七种可能取值.在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型.所谓枚举 ...