├── README.md ├── Simple Control Theory └── README.md ├── Simple Vision └── README.md ├── config ├── 1-1.png └── 1-2.png ├── hardware ├── README.md └── config │ ├── stm32.png │ ├── usb.jpg │ └── x3.jpg ├── homework ├── 1.话题通信 │ ├── README.md │ ├── code │ │ ├── README.md │ │ └── RaySHAOWEI │ │ │ └── src │ │ │ ├── pub.cpp │ │ │ ├── string_converter.cpp │ │ │ └── sub.cpp │ └── config │ │ └── mulu.png ├── 2.服务通信 │ ├── README.md │ └── code │ │ └── code │ │ └── Yang │ │ ├── client1.txt │ │ └── server1.txt ├── 3.参数服务器 │ └── README.md ├── 4.使用launch文件 │ └── README.md ├── 5.学习ROS通信常用API │ └── README.md └── 6.TF2进阶练习 │ └── README.md └── question └── Week1 ├── README.md └── config ├── 2-1.png └── 2-2.png /README.md: -------------------------------------------------------------------------------- 1 | # rc_start_lesson 2 | 3 | ## **前言** 4 | 5 | Why we change? 6 | 7 | 由于学院几年的单片机控制开发遇到了各种各样的瓶颈,我们在今年重组了控制组,引入ROS机器人操作系统作为控制组开发的主要方向: 8 | 9 | 优点如下: 10 | 11 | 1. 调试界面简单直观 12 | 13 | ![](config/1-1.png) 14 | 15 | 2. 能够在机械没出车的情况下完成代码的初调 16 | 17 | 3. 可以根据不同的硬件开发不同的硬件接口,而且硬件驱动只要写一次,便可以通过简单的配置文件使用对应的硬件 18 | 19 | 4. 代码的复用性极强,控制组的同学可以把更多的精力放在开发新技术上,而不是像单片机一样重新实现旧的功能。 20 | 21 | 我们使用的代码框架: 22 | 23 | 我们开发的ros代码是基于ros_control进行开发的,数据流图如下: 24 | 25 | ![](config/1-2.png) 26 | 27 | 这样我们可以通过简单的通过加载不同的控制器,而且控制器与实际硬件环境没有关系,它更像一个可插拔的接口,如果我们要上不同的机器人,只要根据需求加载不同的控制器,写不同的配置文件,不需要写任何一套代码,所有机器人共用一套代码。 28 | 29 | ## **学习建议** 30 | 31 | 刚入门ROS不需要任何的硬件外设,大家只要在各自电脑配好环境即可学习ROS的大部分内容 32 | 33 | 电脑系统: Ubuntu20.04 34 | 35 | ROS系统:ros_noetic 36 | 37 | 常用IDE:Clion,vscode 38 | 39 | 推荐鱼香ROS一键安装: 40 | 41 | [小鱼的一键安装系列 | 鱼香ROS](https://fishros.org.cn/forum/topic/20/%E5%B0%8F%E9%B1%BC%E7%9A%84%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85%E7%B3%BB%E5%88%97?lang=zh-CN) 42 | 43 | 学习网站及资料: 44 | 45 | 1. ROS理论与知识文档 [Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程](http://www.autolabor.com.cn/book/ROSTutorials/index.html) 46 | 47 | 2. Rm_control的开源说明  https://rm-control-docs.netlify.app/en/  48 | 49 | 3. GDUT_ROBOCON开源仓库 https://github.com/gdut-robocon 50 | 51 | 大家应该掌握的程度: 52 | 53 | 1. 至少把ROS理论与知识文档的小车在仿真跑起来并简单进行导航,这里文档都有例程 54 | 55 | 2. 学习ROS会有一定的学习成本,需要大家去进一步努力。 56 | 57 | 其他资料: 58 | 59 | 1. c++学习 基本操作会就可以 60 | 61 | https://www.bilibili.com/video/BV1iW4y1K7LN/?spm_id_from=333.337.search-card.all.click&vd_source=809a8e4a3a25a8809f443b4da653e707 62 | 63 | 2. Shell学习 简单了解 64 | 65 | 3. CMake学习 66 | 67 | https://zhuanlan.zhihu.com/p/500002865 68 | 69 | 70 | 71 | Github: 72 | 73 | [Git以及GithubDesktop配置ssh访问/下载/上传 详细步骤_github desktop ssh_Frost_216的博客-CSDN博客](https://blog.csdn.net/Frost216/article/details/121106062) 74 | 75 | 76 | 77 | https://www.bilibili.com/video/BV13o4y1B7X8/?spm_id_from=333.999.0.0&vd_source=809a8e4a3a25a8809f443b4da653e707 78 | 79 | 80 | 81 | 接下来会根据大家项目课的要求开设课程,大家做好准备。 82 | -------------------------------------------------------------------------------- /Simple Control Theory/README.md: -------------------------------------------------------------------------------- 1 | # 简单入门控制相关理论 2 | 3 | 在本次项目课中同学们应掌握,PID控制理论,底盘解算的知识。 4 | 5 | PID控制算法:https://zhuanlan.zhihu.com/p/39573490https://zhuanlan.zhihu.com/p/39573490 6 | 7 | 8 | 9 | 10 | 11 | 我们这些在ROS中都集成在PID_toolbox里面,但是大家还是要知道这些是如何工作的,能够将一个复杂的控制问题转换为数学问题 12 | 13 | 三向全向轮底盘解算(包括机器人坐标系和世界坐标系): 14 | 15 | https://blog.csdn.net/weixin_41995979/article/details/81704172 16 | 17 | 伪代码如下: 18 | 19 | ```c 20 | //三轮全向轮底盘 21 | void World_3wheels_onmi(float Vx,float Vy,float W,float theta) 22 | { 23 | float A_wheel_target_RPM,B_wheel_target_RPM,C_wheel_target_RPM; 24 | theta = theta* PI / 180.0f; 25 | A_wheel_target_RPM = Vel2Pulse(-( -cos(theta) * Vx -sin(theta) * Vy + Robot_R*W)); 26 | B_wheel_target_RPM = Vel2Pulse(-(+sin(theta+PI/6.0f) * Vx - cos(theta+PI/6.0f) * Vy + Robot_R*W)); 27 | C_wheel_target_RPM = Vel2Pulse(-(+cos(theta+PI/3.0f) * Vx + sin(theta+PI/3.0f) * Vy + Robot_R*W)); 28 | //remember to change ID when you use! 29 | VelCrl(&hcan1,1,A_wheel_target_RPM); 30 | VelCrl(&hcan1,2,B_wheel_target_RPM); 31 | VelCrl(&hcan1,3,C_wheel_target_RPM); 32 | } 33 | ``` 34 | 35 | 所有的底盘解算这些都集成在底盘控制器,一样的,了解这些知识很有必要 36 | -------------------------------------------------------------------------------- /Simple Vision/README.md: -------------------------------------------------------------------------------- 1 | # 简单的视觉应用 2 | 3 | 项目课我们只要完成颜色识别和二维码识别两部分 4 | 5 | 大家可以买openmv模块有很多现用的例程,大家只要调参就可以了 6 | 7 | 教程: 8 | 9 | https://book.openmv.cc/ 10 | 11 | 想进一步学习的同学可以去了解一下opencv库(这才是以后常用的) 12 | https://opencv.apachecn.org/#/ 13 | -------------------------------------------------------------------------------- /config/1-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/config/1-1.png -------------------------------------------------------------------------------- /config/1-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/config/1-2.png -------------------------------------------------------------------------------- /hardware/README.md: -------------------------------------------------------------------------------- 1 | # 八期项目课程设计设想 2 | 3 | ## 一、控制方面 4 | 5 | 一是我们会推进这个ROS学习,具体的话,我们主要的学习不需要任何开发板或者说实际的硬件外设,所有的ROS学习都可以在电脑执行,至于说买上位机,一方面我们买过树莓派,但由于现在溢价过于离谱,经过多方面推荐的权衡,我们选择旭日X3派作为上位机的选型。定价在480元左右,多份购买大概率能够进一步优惠,当然这个的购买我们会通过验收他们的学习进度来判断是否去买这个上位机设备。而且这个设备到时候我们会统一回收,给之后的同学去使用。 6 | 7 | ![](config/x3.jpg) 8 | 9 | 我们对比一下如果用单片机是什么效果,如果上单片机的话,大家首先一定需要硬件来进行学习,而且学习强度跟ROS其实差不大多,开发板像是目前市面上最常用的,例如正点原子的STM32F1精英开发板加上st_link,售价在376元左右,而且在学习过程中一直需要使用硬件这也导致硬件的受损率会更高,更换的频率也更高。而且每个人都会去买,总的来说,花的钱其实更多。 10 | 11 | ![](config/stm32.png) 12 | 13 | 综上所述,无论是从成本还是从整个一个学习过程和管理过程,目前用ROS的开发优点是要大大好于STM32的,而且能够帮助学院进一步发展ROS的相关技术,是意义重大的。 14 | 15 | ### 电机选型: 16 | 17 | 像我们之前一直都是用编码器电机,这样也导致一个后果就是,这些电机没办法很好地保留下来,很多之前的电机要不坏掉要不不见了,很难保留下来,我们在ROCOBON比赛中经常使用大疆的电机,因此在这一方面的保留会做得更好,像今年的ROBOCON比赛就需要大量的2006电机,但之前学院购置的数量有限,经常需要买新电机来补充,如果能够在大一就购置2006电机不仅可以传承下去,而且对于大二打ROBOCON比赛也会有更多的余地,不会像买编码器电机一样经常不见,难以保留下来。 18 | 19 | ## 二,硬件方面 20 | 21 | 这里硬件的同学除了要学习最基本的画图和选型工作外,还要能够写一定的代码来验证自己的想法。这个改变也是学院这么多期共同的共识,这样在开发硬件资源时才不会与之前电控的同学有过多的沟通成本,才会更容易地开发自己的硬件层。这里其实他们只要做一个USB转PWM的模块就可以实现功能(这部分建议八期的同学直接来抄师兄的电路板就可以了),对于之前熟悉STM32的同学来说,这个简单功能的代码量时完全够硬件的同学去学习的,希望电路的同学可以把更多的精力放在代码编辑上,难度并没有像之前画整个核心板以及外设的高。当然为了以防同学们无法按时完成这部分的开发,我们也进行了这部分的选型。 22 | 23 | ![](config/usb.jpg) 24 | 25 | 【淘宝】https://m.tb.cn/h.UJqHnsE?tk=xyROdQsTE0S CZ0001 「USB转UART,I2C,SPI(带4路ADC,4路PWM,8数字IO及nRF2401测试软件)」 26 | 点击链接直接打开 或者 淘宝搜索直接打开 27 | 28 | ## 两套方案的对比:(排除机械) 29 | 30 | | 方案 | STM32 | 价格 | ROS | 价格 | 31 | | ------------- | ------------------------------------------------- | ------------------------------------- |:--------------------------------------------------------------------------------- | ------------------------------------------------------------ | 32 | | 主控 | 学习板:stm32f103精英版    比赛板 | 学习板:376元                    比赛板: 200元 | 旭日X3                                    下层硬件:can   pwm           优点:易保留,而且RC比赛用的上 | 480        can 80  pwm  55 | 33 | | 学习方式 | 需要配合硬件学习,一定要购买学习板 | | 不需要配合实际硬件学习,大部分的学习在自己的电脑上完成。而且我们可以让两组共用一个ROS主控,因为接口简单,调试初参数不用在实车进行,所以这个可以实现。 | | 34 | | 电机 | 选用普通编码器电机                   缺点:难保存,调参数困难,产品质量参差不齐 | 55元 | 选用2006电机                      优点:易保存,大厂出品,为下一年ROBOCON比赛做好准备 | 260元 | 35 | | 硬件受损率 | 常用硬件调参,很容易坏,而且所用的硬件设备难以保留 | | 主要是在gazebo仿真调参,不需要频繁的硬件调参,硬件设备具有高度可复用性,硬件设备保留的难度更低 | | 36 | | 预估价格 | 这里的300元用来购置各种各样的小部件 | 376+200+55*3+300=1041 | 这里的100元主要用来购置舵机和声音模块 | 2006方案480+80+260*3+100=1440  普通电机:                     1000元 | 37 | | 可回收率 | 比赛板基本不可回收,电机和小部件基本不可回收。学习板可以进行回收 | 回收率:33% | 主控板进行回收,2006电机进行回收,小部件回收困难                 若用普通电机,回收率在64.5%左右 | 2006:回收率:87.5%             普通电机:64.5% | 38 | | 评分(以资源浪费作为参照) | 697.47 | 1041-1041*0.33=697.47 | 2006:1440-1440*0.875=180  普通电机:465 | 1440-1440*0.875=180         1000-480-55-55-55=465 | 39 | 40 | 整体来看,两套方案的预计价格其实差不大多,但是ROS的方案能够大大降低以往硬件设备复用性低的问题,下一届的同学在这个项目课中可以把更多的钱花费在刀刃上,不断完善我们这一门课的内容,达到人才培养以及落实相关技术革新的目的。 41 | -------------------------------------------------------------------------------- /hardware/config/stm32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/hardware/config/stm32.png -------------------------------------------------------------------------------- /hardware/config/usb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/hardware/config/usb.jpg -------------------------------------------------------------------------------- /hardware/config/x3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/hardware/config/x3.jpg -------------------------------------------------------------------------------- /homework/1.话题通信/README.md: -------------------------------------------------------------------------------- 1 | # 前言 2 | 3 | 我们的作业就跟紧Autolabor的系列教程,为大家打好这部分的基础。 4 | 5 | #### 注意:这里默认大家已经学会了类和指针。 6 | 7 | 简单看一下目录: 8 | 9 | ![](config/mulu.png) 10 | 11 | 我们重点学会的章节有1,2,4,5,6即可,其他同学们可以自己去拓展 12 | 13 | 好了,现在我们开始布置第一次的作业吧。 14 | 15 | ## 关键词:话题通信 16 | 17 | 编写一个ROS节点,该节点订阅名为“input_topic”的字符串类型话题,并将其转换为大写字母,并通过名为“output_topic”的新话题发布结果。例如,如果输入是“hello world”,那么输出应该是“HELLO WORLD”。 18 | 19 | 要求: 20 | 21 | 1. 订阅的话题名称为“input_topic”,消息类型为std_msgs::String。 22 | 2. 发布的话题名称为“output_topic”,消息类型为std_msgs::String。 23 | 3. 节点名称应为“string_converter”。 24 | 4. 使用C++编写节点。 25 | 26 | 提示: 27 | 28 | 1. 可以使用C++标准库中的std::toupper实现字符串转换。 29 | 2. 可以使用ROS的NodeHandle库函数访问话题。 30 | 3. 记得写callback函数 31 | 32 | 时间:3天 33 | -------------------------------------------------------------------------------- /homework/1.话题通信/code/README.md: -------------------------------------------------------------------------------- 1 | ```cpp 2 | #include 3 | #include 4 | #include 5 | 6 | void stringCallback(const std_msgs::String::ConstPtr& msg) { 7 | std_msgs::String upper_msg; 8 | std::string original_str = msg->data; 9 | std::transform(original_str.begin(), original_str.end(), original_str.begin(), ::toupper); 10 | upper_msg.data = original_str; 11 | ros::NodeHandle ad_nh; 12 | ros::Publisher pub = ad_nh.advertise("output_topic", 1000); 13 | pub.publish(upper_msg); 14 | } 15 | 16 | int main(int argc, char** argv) { 17 | ros::init(argc, argv, "string_converter"); 18 | ros::NodeHandle nh; 19 | ros::Subscriber sub = nh.subscribe("input_topic", 1000, stringCallback); 20 | ros::spin(); 21 | return 0; 22 | } 23 | ``` 24 | 25 | 大家参考一下即可,其实主要实现是在订阅方而不是发布哦。 26 | 27 | 发布方大家就自己去搞搞吧 28 | -------------------------------------------------------------------------------- /homework/1.话题通信/code/RaySHAOWEI/src/pub.cpp: -------------------------------------------------------------------------------- 1 | #include "ros/ros.h" 2 | #include "std_msgs/String.h" 3 | #include 4 | #include 5 | 6 | int main(int argc, char *argv[]) 7 | { 8 | /* 9 | 话题名称:input_topic 10 | 话题内容:小写字母 11 | 消息类型:std_msgs::string 12 | */ 13 | 14 | setlocale(LC_ALL,""); 15 | //初始化节点 16 | ros::init(argc,argv,"publisher"); 17 | //创建节点 18 | ros::NodeHandle nh; 19 | //创建发布者对象 20 | ros::Publisher pub = nh.advertise("input_topic",10);//不超过10条缓存 21 | //创建被发布的消息 22 | std_msgs::String messages; 23 | //10Hz 24 | ros::Rate rate(1); 25 | //填入发布内容 26 | messages.data = "hello world"; 27 | 28 | ros::Duration(3).sleep(); 29 | while(ros::ok()){ 30 | //发布数据 31 | pub.publish(messages); 32 | //调试 33 | ROS_INFO("发布端:%s",messages.data.c_str()); 34 | 35 | rate.sleep(); 36 | 37 | ros::spinOnce(); 38 | } 39 | 40 | return 0; 41 | } -------------------------------------------------------------------------------- /homework/1.话题通信/code/RaySHAOWEI/src/string_converter.cpp: -------------------------------------------------------------------------------- 1 | #include "ros/ros.h" 2 | #include "std_msgs/String.h" 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | //设置全局变量 实例化发布者 10 | static ros::Publisher pub; 11 | static ros::Subscriber sub; 12 | 13 | void toProcess(const std_msgs::String::ConstPtr& msg_p){ 14 | std::string msg = msg_p->data;//标准库字符串 15 | std_msgs::String upper_msg;//消息字符串 16 | 17 | std::transform(msg.begin(),msg.end(),msg.begin(),::toupper);//转换 18 | 19 | upper_msg.data = msg;//赋值 20 | 21 | pub.publish(upper_msg);//发布 22 | } 23 | 24 | int main(int argc, char *argv[]) 25 | { 26 | setlocale(LC_ALL,"");//中文转译 27 | 28 | ros::init(argc,argv,"string_converter");//初始化节点 29 | 30 | ros::NodeHandle string_convert;//ros句柄 31 | 32 | sub = string_convert.subscribe("input_topic",10,toProcess);//订阅 33 | 34 | pub = string_convert.advertise("output_topic",10);//发布 35 | 36 | ros::spin();//回调函数 37 | 38 | return 0; 39 | } -------------------------------------------------------------------------------- /homework/1.话题通信/code/RaySHAOWEI/src/sub.cpp: -------------------------------------------------------------------------------- 1 | #include "ros/ros.h" 2 | #include "std_msgs/String.h" 3 | 4 | void doMsg(const std_msgs::String::ConstPtr& msg_p){ 5 | ROS_INFO("接收端:%s",msg_p->data.c_str());//调试输出 6 | } 7 | int main(int argc, char *argv[]) 8 | { 9 | /* 10 | 话题名称:output_topic 11 | 话题内容:收到的被处理过后的大写字母 12 | 消息类型:std_msgs::string 13 | */ 14 | setlocale(LC_ALL,""); 15 | //初始化 ROS 节点 16 | ros::init(argc,argv,"listener"); 17 | //实例化 ROS 句柄 18 | ros::NodeHandle nh; 19 | 20 | //实例化 订阅者 对象 21 | ros::Subscriber sub = nh.subscribe("output_topic",10,doMsg); 22 | //处理订阅的消息(回调函数) 23 | 24 | //设置循环调用回调函数 25 | ros::spin();//循环读取接收的数据,并调用回调函数处理 26 | 27 | return 0; 28 | } -------------------------------------------------------------------------------- /homework/1.话题通信/config/mulu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/homework/1.话题通信/config/mulu.png -------------------------------------------------------------------------------- /homework/2.服务通信/README.md: -------------------------------------------------------------------------------- 1 | # 服务通信 2 | 3 | 编写一个ROS服务节点,该节点提供一个服务,该服务将两个整数作为输入参数,然后返回这两个整数的和。 4 | 5 | 以下是该服务的详细说明: 6 | 7 | 服务名称:add_two_ints 8 | 9 | 服务类型:ros_tutorials_service/AddTwoInts 10 | 11 | 输入参数: 12 | 13 | int64 a 14 | int64 b 15 | 16 | 输出参数: 17 | 18 | int64 sum 19 | 20 | 21 | 22 | 时间:5天 23 | -------------------------------------------------------------------------------- /homework/2.服务通信/code/code/Yang/client1.txt: -------------------------------------------------------------------------------- 1 | #include "ros/ros.h" 2 | #include "ros_tutorials_service/AddTwoInts.h" 3 | 4 | int main(int argc, char *argv[]) 5 | { 6 | /* 服务器实现: 7 | 1.包含头文件 2.初始化 ROS 节点 3.创建 ROS 句柄 4.创建 客户端 对象 5.请求服务,接收响应 */ 8 | setlocale(LC_ALL,""); 9 | if(argc != 3){//通过动态传值判断输入是否正确 10 | ROS_INFO("请提交两个整数参数"); 11 | return 1;//输入错误,结束程序 12 | } 13 | // 2.初始化 ROS 节点 14 | ros::init(argc,argv,"xiaofeizhe"); 15 | // 3.创建 ROS 句柄 16 | ros::NodeHandle nh; 17 | // 4.创建 客户端 对象 18 | ros::ServiceClient client = nh.serviceClient("add_two_ints"); 19 | // 5.请求服务,接收响应 20 | //组织数据 21 | ros_tutorials_service::AddTwoInts a; 22 | a.request.numA = atoi(argv[1]); 23 | a.request.numB = atoi(argv[2]); 24 | 25 | ros::service::waitForService("add_two_ints"); 26 | bool flag = client.call(a);//查看是否标记成功 27 | if(flag){ 28 | ROS_INFO("请求成功,数据处理结果为%ld",a.response.sum); 29 | }else{ 30 | ROS_INFO("数据请求失败"); 31 | } 32 | 33 | return 0; 34 | } -------------------------------------------------------------------------------- /homework/2.服务通信/code/code/Yang/server1.txt: -------------------------------------------------------------------------------- 1 | #include "ros/ros.h" 2 | #include "ros_tutorials_service/AddTwoInts.h" 3 | 4 | bool callback(ros_tutorials_service::AddTwoInts::Request& request, 5 | ros_tutorials_service::AddTwoInts::Response& response){ 6 | long int num1 = request.numA; 7 | long int num2 = request.numB; 8 | long int sum = num1 + num2; 9 | ROS_INFO("受到的数据是numA = %ld, numB = %ld",num1,num2); 10 | response.sum = sum; 11 | ROS_INFO("求和结果是%ld",response.sum); 12 | return true; 13 | } 14 | 15 | 16 | 17 | int main(int argc, char *argv[]) 18 | { 19 | /* 20 | 服务器实现: 21 | 1.包含头文件 22 | 2.初始化 ROS 节点 23 | 3.创建 ROS 句柄 24 | 4.创建 服务 对象 25 | 5.回调函数处理请求并产生响应 26 | 6.由于请求有多个,需要调用 ros::spin() 27 | */ 28 | // 2.初始化 ROS 节点 29 | setlocale(LC_ALL,""); 30 | ros::init(argc,argv,"fuwuyuan"); 31 | // 3.创建 ROS 句柄 32 | ros::NodeHandle nh; 33 | // 4.创建 服务 对象 34 | ros::ServiceServer server = nh.advertiseService("add_two_ints",callback); 35 | // 5.回调函数处理请求并产生响应 36 | // 6.由于请求有多个,需要调用 ros::spin() 37 | ROS_INFO("服务器启动"); 38 | ros::spin(); 39 | return 0; 40 | } -------------------------------------------------------------------------------- /homework/3.参数服务器/README.md: -------------------------------------------------------------------------------- 1 | 题目:编写一个ROS节点,读取一个yaml文件中的参数,并将其发布到一个名为“yaml_param”的话题上。同时,创建一个订阅者节点,接收“yaml_param”话题的消息,并将其打印到终端上。 2 | 3 | 具体要求: 4 | 5 | 1. 发布者节点名称为“yaml_publisher”,订阅者节点名称为“yaml_subscriber”。 6 | 7 | 2. 发布者节点读取一个名为“my_param”的参数,该参数从一个名为“my_yaml.yaml”的yaml文件中读取。该参数应该是一个字符串类型。 8 | 9 | 3. 发布者节点将参数值发布到一个名为“yaml_param”的话题上,消息类型为std_msgs::String。 10 | 11 | 4. 订阅者节点订阅“yaml_param”话题,接收发布者发布的消息,并将其打印到终端上。 12 | -------------------------------------------------------------------------------- /homework/4.使用launch文件/README.md: -------------------------------------------------------------------------------- 1 | # 使用launch文件 2 | 3 | 将上一次的作业,用launch文件启动一下,要求一口气打开所有节点,包括参数服务器的读取 4 | -------------------------------------------------------------------------------- /homework/5.学习ROS通信常用API/README.md: -------------------------------------------------------------------------------- 1 | [3.1 常用API · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程](http://www.autolabor.com.cn/book/ROSTutorials/di-3-zhang-ros-tong-xin-ji-zhi-jin-jie/31.html) 2 | 请上传学习笔记 3 | -------------------------------------------------------------------------------- /homework/6.TF2进阶练习/README.md: -------------------------------------------------------------------------------- 1 | # TF2进阶 2 | 3 | 题目描述: 4 | 5 | 假设你有两个小乌龟,分别名为"turtle1"和"turtle2"。你需要使用ROS服务通信,在"turtle1"上创建一个服务,该服务将接受一个指定的(x,y)坐标,并返回相对于"turtle1"的TF变换。使用此服务,"turtle1"可以学习如何计算和使用TF变换,以便在其移动期间保持与目标位置的对齐。 6 | 7 | 要求: 8 | 9 | 1. 使用C++编写ROS程序。 10 | 2. 使用服务通信来实现在"turtle1"上创建一个服务,该服务将接受一个指定的(x,y)坐标,并返回相对于"turtle1"的TF变换。 11 | 3. 使用"turtle2"模拟移动并发布它相对于"turtle1"的位置。 12 | 4. "turtle1"应该在它的移动期间使用学习的TF变换来保持与目标位置的对齐。 13 | 14 | 提示: 15 | 16 | 1. 可以使用turtlesim模拟器模拟两个小乌龟。 17 | 2. 可以使用ROS中的tf2库来计算和使用TF变换。 18 | 3. 可以使用turtlesim中的/cmd_vel话题来发布"turtle2"的速度控制信息。 19 | 20 | 21 | 22 | 教程:https://zhuanlan.zhihu.com/p/359374304 23 | -------------------------------------------------------------------------------- /question/Week1/README.md: -------------------------------------------------------------------------------- 1 | # Week1_Q 2 | 以下是一些同学问的问题以及解答 3 | ## Q1:我应该下虚拟机还是用双系统呢? 4 | ### Answer:这边我们建议同学去下载双系统,因为我们在调试和验证机器人算法的时候需要图形化界面,一般在虚拟机上难免会十分卡顿 5 | ### 参考文章:http://t.csdn.cn/aWXwc 6 | 7 | ## Q2:ROS,Vscode,换源这些我要这么搞呢? 8 | ### Answer:这里就说明同学们没有仔细看说明文档哦,这里鱼香ROS已经帮我们完成了大部分的工作,可以说是傻瓜式操作呢 9 | 10 | ## Q3:下载系统后发现声音播不了? 11 | ### Answer:这个的话是显卡驱动的问题,因为一些原因,英伟达这一显卡对linux的系统的优化不是很好,这里我只介绍最简单的办法,如果大家装不上也不会影响我们大部分的使用 12 | #### 打开软件和更新,进入如下界面 13 | ![](config/2-1.png) 14 | 点击这里的附加驱动,下载对应的版本即可,一般下最新的(数字最大的),不要下server版本! 15 | 16 | ## Q4:科学上网 17 | ### Answer:这个就得看大家了,因为也不大方便给大家。不过如果大家只是想上github的话,这里有一个在网上开源的项目,可以推荐这部分同学去搞。 18 | 开源地址:https://gitee.com/klmahuaw/GitHub520 19 | ![](config/2-2.png) 20 | 21 | # 一些建议 22 | 希望同学们在遇到问题的时候可以先去网上搜集解决这类问题的方案,如果解决不了,最好把自己的问题发在群里一起讨论,这样才会提高大家的能力,因为师兄也没有办法解决所有的问题,有时候集体的帮助可能更有效,师兄也会将自己所知道的,能够解决的来告诉大家,帮助到大家的学习。 23 | 24 | # 努力 努力 努力!!! -------------------------------------------------------------------------------- /question/Week1/config/2-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/question/Week1/config/2-1.png -------------------------------------------------------------------------------- /question/Week1/config/2-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gdut-robocon/rc_start_lesson/eb98d3509eb6ee7a0e469cc32e3b633433b78cee/question/Week1/config/2-2.png --------------------------------------------------------------------------------