ROS实践(6)-自建示例
来源:互联网 发布:python中关键字参数 编辑:程序博客网 时间:2024/05/20 05:06
一 单topic
1 初始化环境
创建路径~/dev/mytest,并加入环境变量:
root@yangkai04-Inspiron-3650:~/dev# pwd/root/dev
vim ~/.bashrc
export ROS_PACKAGE_PATH=~/dev/mytest:~/dev/rosbook:/opt/ros/indigo/share:/opt/ros/indigo/stacks
2 建功能包
在路径~/dev/mytest下创建包:
Created package directory /root/dev/mytest/send_and_recv
Created include directory /root/dev/mytest/send_and_recv/include/send_and_recv
Created cpp source directory /root/dev/mytest/send_and_recv/src
Created package file /root/dev/mytest/send_and_recv/Makefile
Created package file /root/dev/mytest/send_and_recv/manifest.xml
Created package file /root/dev/mytest/send_and_recv/CMakeLists.txt
Created package file /root/dev/mytest/send_and_recv/mainpage.dox
Please edit send_and_recv/manifest.xml and mainpage.dox to finish creating your package
root@yangkai04-Inspiron-3650:~/dev/mytest# rospack find send_and_recv
/root/dev/mytest/send_and_recv
root@yangkai04-Inspiron-3650:~# roscd send_and_recv
root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# ls
CMakeLists.txt include mainpage.dox Makefile manifest.xml src
3 创建节点
创建src/send.cpp文件:
#include "ros/ros.h"#include "std_msgs/String.h"#include <sstream>int main(int argc, char **argv) { ros::init(argc, argv, "send"); ros::NodeHandle n; ros::Publisher pub = n.advertise<std_msgs::String>("mine_topic1", 1000); ros::Rate loop_rate(10); while (ros::ok()) { std_msgs::String msg; std::stringstream ss; ss << " I am the example1_a node "; msg.data = ss.str(); //ROS_INFO("%s", msg.data.c_str()); pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); } return 0;}
创建src/recv.cpp文件:
#include "std_msgs/String.h"#include "ros/ros.h"void messageCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); }int main(int argc, char **argv) { ros::init(argc, argv, "recv"); ros::NodeHandle n; ros::Subscriber sub = n.subscribe("mine_topic1", 1000, messageCallback); ros::spin(); return 0; }
修改CMakeLists.txt文件:rosbuild_add_executable(send src/send.cpp)
rosbuild_add_executable(recv src/recv.cpp)
4 编译
root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# rosmake send_and_recv[ rosmake ] Results:
[ rosmake ] Built 23 packages with 0 failures.
[ rosmake ] Summary output to directory
[ rosmake ] /root/.ros/rosmake/rosmake_output-20161207-193309
5 启动
启动master: roscore
启动测试发送节点:rosrun send_and_recv send
启动测试接收节点:rosrun send_and_recv recv
二 多topic
修改src/send.cpp文件:
#include "ros/ros.h"#include "std_msgs/String.h"#include <sstream>int main(int argc, char **argv) { ros::init(argc, argv, "send"); ros::NodeHandle n; ros::Publisher pub1 = n.advertise<std_msgs::String>("mine_topic1", 1000); ros::Publisher pub2 = n.advertise<std_msgs::String>("mine_topic2", 1000); ros::Rate loop_rate(10); while (ros::ok()) { std_msgs::String msg1; std::stringstream ss1; ss1 << " I am the node 1"; msg1.data = ss1.str(); pub1.publish(msg1); //ROS_INFO("%s", msg1.data.c_str()); std_msgs::String msg2; std::stringstream ss2; ss2 << " I am the node 2"; msg2.data = ss2.str(); pub2.publish(msg2); //ROS_INFO("%s", msg2.data.c_str()); ros::spinOnce(); loop_rate.sleep(); } return 0;}
修改src/recv.cpp文件:
#include "std_msgs/String.h"#include "ros/ros.h"void messageCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); }int main(int argc, char **argv) { ros::init(argc, argv, "recv"); ros::NodeHandle n; ros::Subscriber sub1 = n.subscribe("mine_topic1", 1000, messageCallback); ros::Subscriber sub2 = n.subscribe("mine_topic2", 1000, messageCallback); ros::spin(); return 0; }
三 异步多线程
修改src/recv.cpp文件:
#include "std_msgs/String.h"#include "ros/ros.h"void messageCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str());}int main(int argc, char **argv) { ros::init(argc, argv, "recv"); ros::NodeHandle n; ros::AsyncSpinner spinner(4); spinner.start(); ros::Subscriber sub1 = n.subscribe("mine_topic1", 1000, messageCallback); ros::Subscriber sub2 = n.subscribe("mine_topic2", 1000, messageCallback); ros::waitForShutdown(); //ros::spin(); return 0;}
四 rqt_console
原来叫rxconsole,现在叫rqt_console。启动所有节点,roscore,rosrun pkgname nodename,然后命令行输入rqt_console:
五 rqt_graph
rxgraph改名rqt_graph
六 launch文件
root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# vim launch/send_and_recv.launch
<?xml version="1.0" encoding="UTF-8"?>
<launch>
<!-- Logger config -->
<!-- <env name="ROSCONSOLE_CONFIG_FILE"
value="$(find chapter3_tutorials)/config/chapter3_tutorials.config"/> -->
<!-- Example 1 -->
<node pkg="send_and_recv" type="send" name="send"
output="screen"/>
<node pkg="send_and_recv" type="recv" name="recv"
output="screen"/>
</launch>
root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# roslaunch send_and_recv send_and_recv.launch
CTRL+C
七 roswtf
root@yangkai04-Inspiron-3650:~/dev/mytest/send_and_recv# roswtfLoaded plugin tf.tfwtf
Package: send_and_recv
================================================================================
Static checks summary:
No errors or warnings
================================================================================
Beginning tests of your ROS graph. These may take awhile...
analyzing graph...
... done analyzing graph
running graph rules...
... done running graph rules
Online checks summary:
Found 1 warning(s).
Warnings are things that may be just fine, but are sometimes at fault
WARNING The following node subscriptions are unconnected:
* /rosout:
* /rosout
八 rqt_plot
rxplot改名为rqt_plot,可以针对topic中的标量或矢量数据进行绘图,我们修改上面程序中topic1数据类型为Int32
src/send.cpp
#include "ros/ros.h"#include "std_msgs/String.h"#include "std_msgs/Int32.h"#include <sstream>int main(int argc, char **argv) { ros::init(argc, argv, "send"); ros::NodeHandle n; ros::Publisher pub1 = n.advertise<std_msgs::Int32>("mine_topic1", 1000); ros::Publisher pub2 = n.advertise<std_msgs::String>("mine_topic2", 1000); ros::Rate loop_rate(10); std_msgs::Int32 num; num.data = 0; while (ros::ok()) { std_msgs::Int32 msg1 = num; num.data++; pub1.publish(msg1); //ROS_INFO("%s", msg1.data.c_str()); std_msgs::String msg2; std::stringstream ss2; ss2 << " I am the node 2"; msg2.data = ss2.str(); pub2.publish(msg2); //ROS_INFO("%s", msg2.data.c_str()); ros::spinOnce(); loop_rate.sleep(); } return 0;}
src/recv.cpp
#include "std_msgs/String.h"#include "std_msgs/Int32.h"#include "ros/ros.h"void messageCallback1(const std_msgs::Int32::ConstPtr& msg) { ROS_INFO("I heard: [%d]", msg->data); }void messageCallback2(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); }int main(int argc, char **argv) { ros::init(argc, argv, "recv"); ros::NodeHandle n; ros::AsyncSpinner spinner(4); spinner.start(); ros::Subscriber sub1 = n.subscribe("mine_topic1", 1000, messageCallback1); ros::Subscriber sub2 = n.subscribe("mine_topic2", 1000, messageCallback2); ros::waitForShutdown(); //ros::spin(); return 0; }
运行rqt_plot,选择mine_topic1:
0 0
- ROS实践(6)-自建示例
- ROS实践(1)-环境搭建
- ROS实践(2)-乌龟移动
- ROS实践(3)-收发节点
- ROS实践(4)-消息服务
- ROS实践(5)-调试相关
- ROS实践(N)-常见错误
- ROS(6):ROS安装rviz模拟器
- ROS示例----TIAGo教程
- 数据结构实践——自建算法库链栈
- 数据结构实践——自建算法库链串 .
- (二)ROS中控制机器人运动(示例运行)
- (四)ROS坐标变换可视化(示例运行)
- <ROS> pluginlib理解与示例
- ROS编程示例---随机移动
- ROS编程示例---加法客户端
- ROS编程示例---加法服务端
- ROS编程示例---输出消息
- 51 nod 1306 高楼和棋子(反向思考的DP)@
- hive的几种文件格式
- 用 Swift 实现轻量的属性监听系统
- 正则表达式的概念用法和工具下载
- 第15周项目1-验证算法(1)
- ROS实践(6)-自建示例
- 终于开始了!
- 动态规划-股票买卖总结
- python数据分析 -- numpy库初识
- 合并静态库,请不要再用ar x了,坑啊
- mtk 修改 1-开机部分
- 搜索专题(DFS)HDU 1072-Nightmare
- RxAndroid的使用
- oracle学习之:查看用户的信息(状态、默认表空间等)