最近入门ROS编程,希望记录一下学习过程以便后期复习。也希望对于一些刚入门的朋友有所帮助。

我入门教材使用的是Anil Mahtani等人写的《ROS机器人高效编程》以及ROBOTIS公司Turtlebot3开发人员YoonSeok
Pyo等写的《ROS ROBOT
PROGRAMING》。前者对与ROS的框架介绍得比较精要,系统性更好,后者在对ROS的发展和版本等信息的介绍则更清晰。如果在Ubuntu系统中安装ROS,建议参考Turtlebot3人员写的那本,他们将系统设置集成为一个脚本,安装更简单。书中也对脚本中的内容进行了详细的介绍。


都说从实践中学习,首先我们参考《ROS机器人高效编程》进行一些简单的实验。这本书采用的是C++语言编程,虽然ROS将一些基本的类和功能都封装得比较好,不会涉及太底层的计算,但C++节点需要写CMake文件进行编译,后期复杂项目的编程复杂度估计还是要比python高,这里还是用rospy来进行编程。

其实ROS安装的时候在/opt/ros/kinetic/share/rospy_tutorials中有很多示例程序。在ROSPY的官网ROSPY
<http://wiki.ros.org/rospy/>,ROSPY官方指南 <http://wiki.ros.org/rospy_tutorials>
也有很清晰的教程。这里使用示例1进行实验并分析其中的代码。



*
* 1. 在catkin_ws中创建包
<https://blog.csdn.net/u010945141/article/details/81203720#1-在catkinws中创建包>
* 2. 编写代码 (python)
<https://blog.csdn.net/u010945141/article/details/81203720#2-编写代码-python>
* 找到示例文件 <https://blog.csdn.net/u010945141/article/details/81203720#找到示例文件>
* 分析001_talker_listener(publisher_subscriber)
<https://blog.csdn.net/u010945141/article/details/81203720#分析001talkerlistenerpublishersubscriber>
*
* 发布者和订阅者主函数的区别?
<https://blog.csdn.net/u010945141/article/details/81203720#发布者和订阅者主函数的区别>
* 3. 编译功能包 <https://blog.csdn.net/u010945141/article/details/81203720#3-编译功能包>
* 4. 运行roscore节点
<https://blog.csdn.net/u010945141/article/details/81203720#4-运行roscore节点>
* 5. 确定节点运行状态及通讯状态
<https://blog.csdn.net/u010945141/article/details/81203720#5-确定节点运行状态及通讯状态>


1. 在catkin_ws中创建包

打开终端(ctrl+alt+T) 并进入catkin_ws的目录
$sudo catkin_create_pkg ros_newto_example rospy cv_bridge

catkin_create_pkg函数的template

catkin_create_pkg [pkg name] [dependency 1]…

2. 编写代码 (python)

找到示例文件

$ roscd rospy_tutorials

分析001_talker_listener(publisher_subscriber)

第一个示例涉及两个节点:1个发布者(talker/publisher)及1个订阅者(listener/subscriber)

talker代码:
#!/usr/bin/env python import rospy from std_msgs.msg import String def talker()
: pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node(
'talker', anonymous=True) rate = rospy.Rate(10) # 10hz while not
rospy.is_shutdown(): hello_str ="hello world %s" % rospy.get_time()
rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep()if __name__ ==
'__main__': try: talker() except rospy.ROSInterruptException: pass
talker的设计思路是:
Created with Raphaël 2.1.2定义节点为主题“chatter"的发布者创建节点并命名为talker确定发布频率为10hz (每秒十次)
节点活动?持续发出信息定义消息为"hello world+时间"在日志中记录消息发布消息根据定义的活动频率进入休息状态?sleepwakeEndyesnoyes
no
根据定义的活动频率进入休息状态(每秒十次之间进入休眠状态,并在固定时间点恢复激活态)

listener思路:
#!/usr/bin/env python import rospy from std_msgs.msg import String def callback
(data): rospy.loginfo(rospy.get_caller_id() + 'I heard %s', data.data) def
listener(): rospy.init_node('listener', anonymous=True) rospy.Subscriber(
'chatter', String, callback) rospy.spin() if __name__ == '__main__': listener()
Created with Raphaël 2.1.2创建节点并命名注册节点为主题'chatter'的订阅人保持节点为活动状态收到信息?
callback:在日志文件中记录一条“接受记录”:发布者ID+信息内容yesno
发布者和订阅者主函数的区别?

C++版ros.h有spin 和 spinOnce
两个函数。spin函数不断执行主循环而spinOnce在不中断的情况下运行主循环。而python版只有spin函数,故订阅者的截断通过is_shutdown()函数确定节点状态来决定是否继续发送消息

如对参数设定有疑问,在python console中用help([module].[function])查看

注:创建节点和定义节点发布者/订阅者身份的次序可调换

3. 编译功能包

$ catkin_make --pkg <pkg_name>

如果用C++编写节点的话,这里还需要写CMake.txt用rosed或其它工具编译cpp文件;

4. 运行roscore节点

新建终端
$ roscore
另建两个终端分别运行节点(后面会学习用launch文件一次启动多个节点)
$ rosrun [pkg_name] [node_name]

5. 确定节点运行状态及通讯状态

这是一些查看ros网络的命令工具。其中rqt_graph将节点与节点之间通讯的主题用可视化的形式展现出来;
rosnode和rostopic主要是查看网络中节点和主题的具体信息。参数通过$ rosnode --help查看
$ rqt_graph
$ rosnode list
$ rosnode info /listner-xxx
$ rosnode info /talker-xxx
$ rostopic list
$ rostopic info chatter-xxx
$ rostopic bw chatter-xxx(可以看到传输速度,传输量等)

参考文献:
[1] rospy 官方文档:http://wiki.ros.org/rospy_tutorials
<http://wiki.ros.org/rospy_tutorials>
节点代码版权归属: Copyright (c) 2008, Willow Garage, Inc.

转载请注明出处

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信