ROS/C++ 入门(Introduction to ROS/C++) 原文https://syrotek.ciirc.cvut.cz/course/ROS_CPP_INTRO当我看到这一个教程的时候很兴奋因为这里面的东西很实在干货比较多。这个系列的教程有基于stage的仿真有实物对照还是不错的。所有的翻译不一定完全遵照原文掺杂有翻译者的个人经验和理解主要内容1. ROS的入门介绍2.基于激光雷达的避障3.沿墙运动4.PID控制器5.里程计的矫正6.固定路径跟随1、ROS 入门介绍ROS (Robot Operating System)ROS是一个编写机器人软件很灵活的框架它包含了工具集、库和协议conventions这些包通过交叉不同的机器人平台可以简化机器人的开发。ROS支持多中操作系统但是官方支持的是ubuntu每一个版本ubuntu对应一个ROS版本ROS indigo 版本对应的是ubuntu 14.04,kinetic对应ubuntu 16.04本教程采用的是ros kinetic版本。在ros下运行的可以理解为图节点通过ROS的通信框架这些线程被松散耦合到一起。编写ROS时候采用ROS的客户端库ROS允许用不同程序编写的节点进行通讯。节点既可以通过topic进行subscribe/publish也可以服务service的方式进行通讯。ROS只有一个MASTER节点它提供的是名称检索服务帮助节点之间建立通讯。roscore的启动命令roscore节点启动命令;rosrun package_name executable_name parameters如果有多个节点要启动可以编写launch文件通过roslaunch命令启动。创建包packages编写ROS程序时候需要首先创建一个package1首先跳转到路径catkin_ws/src下面。执行下面的指令catkin_create_pkg package_name [dep1] ... [depN]将package_name替换为自己的package名字dep1 。。。 depN为依赖包本教程中常用依赖项为roscpp、std_msgs。编写C时候依赖包要包含roscpppython程序需要rospy用其他语言编写ROS程序不推荐因为支持的不是特别好。添加依赖roscpp后生成的包里面会在目录下面生成两个新文件(package.xml, CMakeLists.txt)和两个新目录(src/, include/)你可以在package.xml填写这个package的相关信息作者版本名字、描述、、、 。头文件一般放在include目录下面源文件放在src目录下面。准备 CMakeLists.txt可以设置变量来包含所有必要的源文件set (SRCS1 ${SRCS1} src/file_1.cpp)set (SRCS1 ${SRCS1} src/file_2.cpp)包含catkin文件路径include_directories(include ${catkin_INCLUDE_DIRS})创建可执行文件和catkin库add_executable(executable_name ${SRCS1})## executable_name 节点的名字target_link_libraries(executable_name ${catkin_LIBRARIES})编译程序跳转到catkin_ws目录下面执行下面的指令:catkin_makeROS and C如果是用C编写的ROS程序必须添加roscpp依赖ros.h里面有常用的ros代码#include ros/ros.hros程序正常运行必须得初始化ros::init(argc, argv, name_of_the_node);初始化完成后需要一个Nodehandle进行ros的资源管理、通信ros::NodeHandle n;Messages 和 topics如上面提到的分立的节点之间是通过topic进行通讯的。每一个节点既可以publish 消息到topic上面也可以通过subscribe的方式获得topic上的信息。ROS里面包含了很多种类的messages也可以自己创建。基本的消息类型包含在std_msgs包里面。大多数的消息里面会包含std_msgs::Header。你可以看到这个message的详尽内容如下操作rosmsg show Header输出结果uint32 seq time stamp string frame_idHeader里面包含了三个变量seq序列号保证发送的多个消息可以正确的排列stamp是epoch格式的时间戳。frame_id为坐标系名字header的名字可以通过std_msgs::Header类在C中访问。为了能够发布消息必须创建一个publisher对象ros::Publisher pub n.advertisestd_msgs::Header(topic_name, 1000);1000为缓冲区的大小通过pub函数进行发送消息pub.publish(message);定于一个主题的时候需要创建一个callback函数接收和处理订阅的topic的消息。void callback(const std_msgs::Header::ConstPtr msg);创建一个subscriber在消息publish到topic上时候会调用这个callback函数。ros::Subscriber sub n.subscribe(topic_name, 1000, callback);也可以把callback函数写作类里面ros::Subscriber sub n.subscribe(topic_name, 1000, SomeClass::callback, instanceOfThatClass);最后调用spin开始subscribe消息ros::spin();ROS常用调试图形化工具rqtrviz[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UUrcvdY2-1593495897541)(https://img-blog.csdn.net/20171119164111634?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd190b20/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA/dissolve/70/gravity/SouthEast)]机器人stage 仿真下载仿真机器和环境(右键另存为)eci-arena.world运行指令启动仿真环境rosrun stage_ros stageros path_to_the_world_file/eci-arena.world