【嵌入式系统应用开发】ROS环境安装配置与入门实操

2023-05-16

目录

  • 前言
  • 1 ROS简介
  • 2 ROS软件安装
    • 2.1 添加ROS软件源
    • 2.2 添加密钥
    • 2.3 安装ROS
    • 2.4 初始化rosdep
    • 2.5 设置环境变量
    • 2.6 安装rosinstall
  • 3 ROS初试——小海龟
    • 3.1 启动ROS Master
    • 3.2 启动小海龟仿真器
    • 3.3 控制海龟控制节点
  • 4 ROS话题发布和订阅节点
    • 4.1 创建话题发布者Publisher
    • 4.2 创建话题订阅者Subscriber
    • 4.3 编译功能包
    • 4.4 运行Publisher和Subscriber
    • 4.5 测试结果
  • 5 控制小海龟走圆形
    • 5.1 建立ROS工作空间
    • 5.2 配置环境变量
    • 5.3 ROS机器人画圆程序的编写
    • 5.4 启动ROS机器人
  • 总结

前言

环境 Ubuntu18.04

1 ROS简介

ROS(机器人操作系统,Robot Operating System),是专为机器人软件开发所设计出来的一套电脑操作系统架构。它是一个开源的元级操作系统(后操作系统),提供类似于操作系统的服务,包括硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间消息传递、程序发行包管理,它也提供一些工具和库用于获取、建立、编写和执行多机融合的程序。

ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括:

  1. 基于服务的同步RPC(远程过程调用)通讯;
  2. 基于Topic的异步数据流通讯,还有参数服务器上的数据存储。

2 ROS软件安装

2.1 添加ROS软件源

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

在这里插入图片描述

2.2 添加密钥

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

在这里插入图片描述

2.3 安装ROS

sudo apt update
sudo apt-get install ros-melodic-desktop-full

注意:需要根据Ubuntu的版本选择合适的ROS版本。否则会出现Unable to locate package ros-kinetic-desktop-full的错误。ROS的版本主要有Melodic、Lunar、Kinetic版本,根据linux系统不同选择合适的版本

在这里插入图片描述

2.4 初始化rosdep

sudo rosdep init
rosdep update
  1. 出现ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sources.list.d/20-default.list Website may be down.的错误
cd /etc
sudo gedit hosts

在文本后面添加(ip是通过https://site.ip138.com进行输入raw.githubusercontent.com查询获取得到,任意选择一个)
ip raw.githubusercontent.com

在这里插入图片描述

修改好后,结果如下
在这里插入图片描述

2.5 设置环境变量

echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc

2.6 安装rosinstall

sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential

3 ROS初试——小海龟

3.1 启动ROS Master

roscore

3.2 启动小海龟仿真器

rosrun turtlesim turtlesim_node

3.3 控制海龟控制节点

rosrun turtlesim turtle_teleop_key

实现结果如下

在这里插入图片描述

4 ROS话题发布和订阅节点

首先创建一个功能包,命名为topic,添加roscpprospy等依赖项。
在这里插入图片描述

4.1 创建话题发布者Publisher

Publisher的主要作用是针对制定话题发布特定数据类型的消息。我们用代码实现一个节点,并且在节点中创建一个Publisher并发布字符串“Hello World”,代码如下:

#include <sstream>
#include "ros/ros.h"
#include "std_msgs/String.h"
 
int main(int argc, char **argv)
{
     //ROS节点初始化
ros::init(argc,argv,"talker");
 
     //创建节点句柄
ros::NodeHandle n;
 
     //创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String
ros::Publisher chatter_pub =n.advertise<std_msgs::String>("chatter",1000);
 
      //设置循环的频率
ros::Rate loop_rate(10);
 
int count = 0;
 
while (ros::ok())
{
     // 初始化std_msgs::String类型的消息
      std_msgs::String msg;
      std::stringstream ss;
      ss <<"hello world" << count;
      msg.data = ss.str();
  
    //发布消息
      ROS_INFO("%s",msg.data.c_str());
      chatter_pub.publish(msg);
      
 
      //循环等待回调函数
      ros::spinOnce();
 
      //按照循环频率延时
       loop_rate.sleep();
       ++count;
}
return 0;
}

4.2 创建话题订阅者Subscriber

下面创建一个Subscriber以订阅Publisher节点发布的“Hello World”字符串,实现代码如下:

#include "ros/ros.h"
#include "std_msgs/String.h"
 
 //接收到订阅的消息后,会进入消息回调函数
 
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
         //将接收到的信息打印出来
        ROS_INFO("I heard: [%s]",msg->data.c_str());
}
 
int main (int argc, char **argv)
{
        //初始化ROS节点
 
       ros::init(argc,argv,"listener");
     
       //创建节点句柄
       ros::NodeHandle n;
 
   //创建一个Subscriber,订阅名为chatter的话题,注册回调函数chatterCallback
 
    ros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);
    
     //循环等待回调函数
   
     ros::spin();
 
      return 0;
}

4.3 编译功能包

编辑该功能包的CMakeLists.txt文件,如下:

## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)
##add_executable(hello ~/Alltest/catkin_ws/src/learning_communication/src/hello.cpp)
 
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
 
add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp)

4.4 运行Publisher和Subscriber

在工作空间根目录设置环境变量并编译:

source devel/setup.bash
catkin_make

4.5 测试结果

需要运行三个终端,分别运行roscore,发布节点,订阅节点

  1. 运行roscore,在第一个终端输入:
roscore
  1. 运行话题发布者,在第二个终端中输入:
source ./devel/setup.bash
rosrun topic_pub_sub publisher
  1. 运行话题订阅者,在第三个终端中输入:
source ./devel/setup.bash
rosrun topic_pub_sub subscriber

结果如下:
在这里插入图片描述
在这里插入图片描述

5 控制小海龟走圆形

5.1 建立ROS工作空间

与上述步骤相同,不做赘述

5.2 配置环境变量

在catkin_ws路径下终端输入

source devel/setup.bash

使系统知道功能包放置在catkin_ws这个工作空间下。
查看当前环境变量,终端输入

echo $ROS_PACKAGE_PATH

在这里插入图片描述

5.3 ROS机器人画圆程序的编写

打开终端,在catkin_ws/src路径下新建my_turtle_package包

catkin_create_pkg my_turtle_package rospy roscpp

在这里插入图片描述
在my_turtle_package/src 中创建cpp文件

gedit draw_circle.cpp

编写代码如下:

#include "ros/ros.h"
#include<geometry_msgs/Twist.h> //运动速度结构体类型  geometry_msgs::Twist的定义文件
 
int main(int argc, char *argv[])
{
    ros::init(argc, argv, "vel_ctrl");  //对该节点进行初始化操作
    ros::NodeHandle n;         //申明一个NodeHandle对象n,并用n生成一个广播对象vel_pub
    ros::Publisher vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
    //vel_pub会在主题"/cmd_vel"(机器人速度控制主题)里广播geometry_msgs::Twist类型的数据
    ROS_INFO("draw_circle start...");//输出显示信息
    while(ros::ok())
    {
        geometry_msgs::Twist vel_cmd; //声明一个geometry_msgs::Twist 类型的对象vel_cmd,并将速度的值赋值到这个对象里面
 
        vel_cmd.linear.x = 2.0;//前后(+-) m/s
        vel_cmd.linear.y = 0.0;  //左右(+-) m/s
        vel_cmd.linear.z = 0.0;
 
        vel_cmd.angular.x = 0;
        vel_cmd.angular.y = 0;
        vel_cmd.angular.z = 1.8; //机器人的自转速度,+左转,-右转,单位是rad/s
        vel_pub.publish(vel_cmd); //赋值完毕后,发送到主题"/cmd_vel"。机器人的核心节点会从这个主题接受发送过去的速度值,并转发到硬件体上去执行
 
        ros::spinOnce();//调用此函数给其他回调函数得以执行(比例程未使用回调函数)
    }
    return 0;
}

打开CMakeLists.txt,在CMakeLists.txt文件中找到##Declare a C++ executable,在这一行的前面添加如下内容:

add_executable(draw_circle src/draw_circle.cpp)
target_link_libraries(draw_circle ${catkin_LIBRARIES})

保存并退出CMakeLists.txt文件。然后在terminal中继续输入如下命令进行编译:

cd ~/catkin_ws/
catkin_make

在这里插入图片描述

5.4 启动ROS机器人

  1. 打开第一个终端(terminal),启动ros
roscore
  1. 打开第二个终端(terminal),启动rosnode
rosrun turtlesim turtlesim_node
  1. 打开第三个终端(terminal),启动my_turtle_package节点
cd  ~/catkin_ws/
source devel/setup.bash
rosrun my_turtle_package draw_circle

结果如下:

在这里插入图片描述

总结

通过本次作业,熟悉了解了ROS,安装ROS的整个过程,首先需要选择对应版本的ROS,在安装的过程中出现了许多问题,在查询相关资料后,都可以基本解决。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【嵌入式系统应用开发】ROS环境安装配置与入门实操 的相关文章

随机推荐

  • 怒飞垂云视频教程 二、基于waf编译飞控固件

    原文链接 xff1a http www nufeichuiyun com p 61 246 怒而飞 xff0c 其翼若垂天之云 xff01 我是怒飞 QQ xff1a 3500985284
  • 怒飞垂云视频教程 三、基于eclipse编译飞控固件

    基于eclipse编译飞控固件 xff0c 原文链接 xff1a http www nufeichuiyun com p 61 249
  • 怒飞垂云视频教程 四、建立软件仿真环境

    原文链接 xff1a http www nufeichuiyun com p 61 256 怒而飞 xff0c 其翼若垂天之云 xff01 我是怒飞 QQ xff1a 3500985284
  • docker:国内 hub 镜像地址

    七牛云
  • C++读取STL模型文件

    数据格式 二进制的数据格式 xff1a 二进制STL文件用固定的字节数来给出三角面片的几何信息 80 80个字节的文件头 xff0c 用于存贮文件名 4 4 个字节的int描述模型的三角面片个数 小端存储 50 n 一个三角面片占用固定的5
  • mNetAssist(arm64)linux下图形界面的网络调试助手

    linux下图形界面的网络调试助手mNetAssist 网上均为x86 amd处理器的 想在arm64上使用 所以 自己down了源码编译了一遍 方便大家使用 项目地址 码云 https gitee com justsure m net a
  • 激光SLAM建图过程中的问题MessageFilter [target=odom_combined ]:Dropped 100.00% of messages so far.,解决方案

    最近在和师弟用kobuki底盘进行SLAM建图的过程中遇到一个比较棘手的问题 xff0c 一直没有解决 xff0c 直到今天我在仿真环境中也碰到了 WARN 1618301922 711685031 2351 764000000 Messa
  • Linux 内核优化-调大TCP最大连接数

    一 tcp 概述 1 服务器如何标识tcp连接 xff1f 在tcp应用中 xff0c server事先在某个固定端口监听 xff0c client主动发起连接 xff0c 经过三路握手后建立tcp连接 在确定最大连接数之前 xff0c 先
  • 飞书妙记用法小结

    企业升级后 xff0c 可以到达10G 妙记的2G不是指代识别容量 xff0c 而是指代源文件容量 额度满了以后 选择权益数据 那么如果容量满了的话 xff0c 怎么释放呢 xff1f 需要删除回收站里面的所有文件 xff0c 才可以释放
  • 3-1利用文件流复制文件内容-Java

    题目 xff1a 编程利用文件流把一个文本文件中的内容复制到另外一个文件中 解答 xff1a Test类 xff1a package Experiment 3 Question 1 import java io public class T
  • C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)

    将类型名作为强制类型转换运算符的做法是C语言的老式做法 xff0c C 43 43 为保持兼容而予以保留 C 43 43 引入了四种功能不同的强制类型转换运算符以进行强制类型转换 xff1a static cast reinterpret
  • 字符数组的初始化与赋值

    代码编译运行环境 xff1a VS2017 43 Win32 43 Debug 1 字符数组的初始化方式 C语言中表示字符串有两种方式 xff0c 数组和指针 xff0c 字符数组是我们经常使用的方式 变量的定义包括指明变量所属类型 变量名
  • XML和HTML之间的差异

    XML 不是 HTML 的替代 XML 和 HTML 为不同的目的而设计 xff1a XML 被设计用来传输和存储数据 xff0c 其焦点是数据的内容 HTML 被设计用来显示数据 xff0c 其焦点是数据的外观 HTML 旨在显示信息 x
  • 线程、线程句柄、线程ID

    什么是句柄 xff1a 句柄是一种指向指针的指针 我们知道 xff0c 所谓指针是一种内存地址 应用程序启动后 xff0c 组成这个程序的各对象是住留在内存的 如果简单地理解 xff0c 似乎我们只要获知这个内存的首地址 xff0c 那么就
  • Modbus通信协议

    一 Modbus 协议简介 Modbus 协议是应用于电子控制器上的一种通用语言 通过此协议 xff0c 控制器相互之间 控制器经由网络 xff08 例如以太网 xff09 和其它设备之间可以通信 它已经成为一通用工业标准 有了它 xff0
  • 77组合

    给定两个整数 n 和 k xff0c 返回 1 n 中所有可能的 k 个数的组合 示例 输入 n 61 4 k 61 2 输出 2 4 3 4 2 3 1 2 1 3 1 4 最容易想到的应该是回溯 xff0c 更多题目思路及代码见 xff
  • 结构体内数据元素对齐

    默认情况下 xff0c 为方便结构体内元素的访问于管理 xff0c 当结构体内的数据元素的长度小于处理器的位数的时候 xff0c 便以结构体内的最长数据元素为对齐单位 xff0c 即结构体的长度一定为最长数据元素的长度的整数倍 如果结构体内
  • 关于stm32中串口重定向问题详解(找个时间好好理解下)

    usart这部分代码我也是从网上copy出来的 xff0c 一下是作者的解释 xff1a 简单地说 xff1a 想在mdk 中用printf xff0c 需要同时重定义fputc函数和避免使用semihosting 半主机模式 xff09
  • 缓冲区溢出(buffer overflow)避免方法

    什么是缓冲区溢出 xff1f copy数据进buffer时 xff0c 数据长度超过buffer中的剩余空间 缓冲区溢出的危害 xff1f 缓冲区溢出 xff0c 结果随机 xff0c 可能会导致程序功能不正常 xff0c 也可能导致程序崩
  • 【嵌入式系统应用开发】ROS环境安装配置与入门实操

    目录 前言1 ROS简介2 ROS软件安装2 1 添加ROS软件源2 2 添加密钥2 3 安装ROS2 4 初始化rosdep2 5 设置环境变量2 6 安装rosinstall 3 ROS初试 小海龟3 1 启动ROS Master3 2