机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLA...-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 7555|回复: 1

机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLA...

[复制链接]
发表于 2020-2-20 09:45 | 显示全部楼层 |阅读模式
经过5年尝试和努力,在吸取indigo、kinetic版本经验后,融合Arduino、ROS1、ROS2、Gazebo和SLAM的适用机器人爱好者的实践课程镜像尝鲜版(bug是免不了的!_!)终于完成了。

沉迷机器人操作系统的一个理由和四种修仙秘籍
ROS2机器人操作系统零基础快速入门
唯一需要自备的硬件为Arduino及其相关配件:
制作遥控ROS机器人的手柄或IoT物联网传感器
机器人实践课程镜像分享及使用说明分为6大部分,分别为:
镜像使用说明
Arduino案例
ROS1案例
ROS2案例
Gazebo案例
SLAM案例
镜像依据本科课程制作,以项目式案例教学和实践为主,适用上述课程(点击可打开链接,了解详细内容):
分别涵盖在不同时期发布的教学镜像中,经过学生使用、实践和反馈,逐步改进和完善,但由于水平有限和能力不足,依然存在不少问题,可自行研究解决。


第一部分:镜像使用说明
下载链接:https://share.weiyun.com/5yS1hT6 密码:rmxebn
制作iso镜像U盘启动使用rufus-3.8p,可以直接去官网下载,iso镜像文件较大3.54GB。


实践课已经详细讲解过使用方式,需要用管理员权限启动rufus,具体流程如下图所示。


支持legacy和UEFI双模式。


制作速度依据U盘读写速度而定,SLC盘小于2分钟,年代久远的古董盘超过20分钟也正常。


做好后的课程学习盘内部文件如下图所示:
在开机BIOS设置为U盘启动,或者直接快捷方式更改启动顺序设定U盘为先。


此处需注意,legacy和UEFI启动界面略有差异,镜像支持安装:


打开终端,输入$ sudo ubiquity    输入密码:ros


此镜像为个人上课使用,测试时间2018.6-2020.1,用户名为博客名,不喜欢可以随意修改。


测试过10+型号笔记本和台式机,兼容性良好,也有部分电脑需要专业级设置,属于个别案例。


测试截图如下:


1. U盘系统:
较新配置台式机
较旧配置台式机


2. U盘镜像:
较新配置笔记本
较旧配置笔记本
Desktop
Arduino

# turtlebot3 model env TURTLEBOT3_MODEL  model type [burger, waffle, waffle_pi]" name="model"
export TURTLEBOT3_MODEL=waffle
ROS1+ROS2






Gazebo










SLAM    高翔 等著, 视觉SLAM十四讲:从理论到实践(第2版)


第二部分:Arduino案例
AD0-LED13
// These constants won't change. They're used to give names to the pins used:
int i=0,j=0,stime=32,sloop=0;
const int atime=16;
const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to

int sensorValue = 0;        // value read from the pot
int outputValue = 0;        // value output to the PWM (analog out)

void setup() {
  // initialize serial communications at 9600 bps:
  pinMode(LED_BUILTIN, OUTPUT);  
  Serial.begin(9600);
}

void loop() {
  // read the analog in value:
  sensorValue = analogRead(analogInPin);
  // map it to the range of the analog out:
  outputValue = map(sensorValue, 0, 1023, 0, atime);
  // change the analog out value:
  stime=outputValue;
  // print the results to the Serial Monitor:
  //Serial.print("sensor = ");
  //Serial.print(sensorValue);
  //Serial.print("\t output = ");
  //Serial.println(outputValue);
  ledfade(stime);
  // wait 2 milliseconds before the next loop for the analog-to-digital
  // converter to settle after the last reading:
}

void ledfade(int i)
{
      digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(i);                          // wait for a second
      digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
      delay(atime-i);                    // wait for a second
}
AD3&4&5-/cmd_vel(ROS)
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include <ros.h>
#include <rosserial_arduino/Adc.h>
#include <geometry_msgs/Twist.h>

ros::NodeHandle nh;

rosserial_arduino::Adc adc_msg;
geometry_msgs::Twist twist_msg;
ros:ublisher p("adc", &adc_msg);
ros:ublisher t("cmd_vel", &twist_msg);
//turtlesim turtle1/cmd_vel
//turtlebot3 cmd_vel
//husky cmd_vel
void setup()
{
  pinMode(13, OUTPUT);
  nh.initNode();
  nh.advertise(p);
  nh.advertise(t);
}

//We average the analog reading to elminate some of the noise
int averageAnalog(int pin){
  int v=0;
  for(int i=0; i<4; i++) v+= analogRead(pin);
  return v/4;
}

long adc_timer;
int x_mid=600,y_mid=600,x_now=600,y_now=600;
int adc_init=100;
void loop()
{
  adc_msg.adc0 = averageAnalog(0);
  adc_msg.adc1 = averageAnalog(1);
  adc_msg.adc2 = averageAnalog(2);
  adc_msg.adc3 = averageAnalog(3);
  adc_msg.adc4 = averageAnalog(4);
  adc_msg.adc5 = averageAnalog(5);
  x_now=adc_msg.adc5-x_mid;
  y_now=adc_msg.adc4-y_mid;
  adc_init=adc_msg.adc3;
  if(adc_init<10){
    x_mid=adc_msg.adc5;
    y_mid=adc_msg.adc4;
  }
  if(x_now>0)
    twist_msg.linear.x=map(x_now,0,1023-x_mid,0,255);
  else
    twist_msg.linear.x=map(x_now,-x_mid,0,-255,0);
  if(y_now>0)
    twist_msg.angular.z=map(y_now,0,1023-y_mid,0,255);
  else
    twist_msg.angular.z=map(y_now,-y_mid,0,-255,0);

  twist_msg.linear.x=twist_msg.linear.x/(1024.0-adc_msg.adc0)/4.0;
  twist_msg.angular.z=-twist_msg.angular.z/(1024.0-adc_msg.adc0);
         
  p.publish(&adc_msg);
  t.publish(&twist_msg);
  nh.spinOnce();
//  delay(1);
}
C++&Arduino+ROS


第三部分:ROS1案例
turtlesim+action





roscore

rosrun turtlesim turtlesim_node

rosrun turtle_actionlib shape_server

rosrun turtle_actionlib shape_client

rqt_graph
turtlebot3+rqt_image_view





roslaunch turtlebot3_gazebo turtlebot3_world.launch

rqt_image_view
第四部分:ROS2案例
turtlesim+action+rqt




ros2 run turtlesim turtlesim_node

ros2 run turtlesim turtle_teleop_key

rqt
dummy_robot_bringup+rviz2




ros2 launch dummy_robot_bringup dummy_robot_bringup.launch.py

rviz2
demo.rviz
第五部分:Gazebo案例
ROS1
ROS编程基础课程2019更新版资料和习题解答说明(ETH苏黎世联邦理工学院)适用indigo、kinetic和melodic




ROS2
Gazebo和ROS2的使用说明




ros2 topic pub /demo/cmd_demo geometry_msgs/Twist '{linear: {x: 0.2}}' -1
第六部分:SLAM案例
理论基础1-6章
实践应用7-14章
高翔 等著, 视觉SLAM十四讲:从理论到实践(第2版)

2020-01-07


~Fin~
————————————————


发表于 2020-10-15 12:25 | 显示全部楼层
大师,有联系方式吗?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-12-27 11:25 , Processed in 0.071210 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表