Parrot系统下ROS1试用CoCubeSim

Ubuntu 22.04安装和使用ROS1可行吗_ubuntu22.04安装ros1-CSDN博客 


 

Parrot系统

如果你还不了解这个系统,如下文字就不用接着看了。


为何使用

为何更好的应用各类互联网信息,仅此而已。


开发利器


终端


ROS1和ROS2支持所有操作系统,支持的硬件芯片也是越来越多。

大部分ROS1支持安装如下:

sudo apt install ros-desktop-full ros-desktop-full-dev

sudo apt install ros-desktop-full ros-desktop-full-dev

sudo apt install ros-desktop-full ros-desktop-full-dev

等待结束就行,无需其他任何配置。


未安装


配色

白底黑字


安装ROS1后

启动roscore

 

ros1是debian永久支持的。常见发行版如ubuntu。

15是N之后的那个字母吧,noetic之后的。O 


cocubesim 

这个就是turtlesim改的。

zhangrelay / cocubesim · GitCode

git clone https://gitcode.net/ZhangRelay/cocubesim

常用和编程相关的软件parrot都默认安装了,非常方便,使用多年,但是不推荐Linux初学者使用。 

解压缩:

tar -xf cocubesim.tar

然后到对应文件夹下编译:

catkin_make 

如果要使用catkin build,需要配置一下。

sudo apt install catkin-tools

等待一小会就ok。

 

运行顺畅

 


修改代码

 

/** Copyright (c) 2009, Willow Garage, Inc.* All rights reserved.** Redistribution and use in source and binary forms, with or without* modification, are permitted provided that the following conditions are met:**     * Redistributions of source code must retain the above copyright*       notice, this list of conditions and the following disclaimer.*     * Redistributions in binary form must reproduce the above copyright*       notice, this list of conditions and the following disclaimer in the*       documentation and/or other materials provided with the distribution.*     * Neither the name of the Willow Garage, Inc. nor the names of its*       contributors may be used to endorse or promote products derived from*       this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE* POSSIBILITY OF SUCH DAMAGE.*/#include "turtlesim/turtle_frame.h"#include <QPointF>#include <ros/package.h>
#include <cstdlib>
#include <ctime>#define DEFAULT_BG_R 0xff
#define DEFAULT_BG_G 0xff
#define DEFAULT_BG_B 0xffnamespace turtlesim
{TurtleFrame::TurtleFrame(QWidget* parent, Qt::WindowFlags f)
: QFrame(parent, f)
, path_image_(500, 500, QImage::Format_ARGB32)
, path_painter_(&path_image_)
, frame_count_(0)
, id_counter_(0)
{setFixedSize(500, 500);setWindowTitle("CoCubeSim");srand(time(NULL));update_timer_ = new QTimer(this);update_timer_->setInterval(16);update_timer_->start();connect(update_timer_, SIGNAL(timeout()), this, SLOT(onUpdate()));nh_.setParam("background_r", DEFAULT_BG_R);nh_.setParam("background_g", DEFAULT_BG_G);nh_.setParam("background_b", DEFAULT_BG_B);QVector<QString> turtles;turtles.append("cocubea.png");turtles.append("cocubeb.png");turtles.append("cocubec.png");turtles.append("cocubed.png");turtles.append("cocubee.png");turtles.append("cocubef.png");turtles.append("cocubeg.png");turtles.append("cocubeh.png");turtles.append("cocubei.png");turtles.append("cocubej.png");turtles.append("cocubek.png");
/*  turtles.append("box-turtle.png");turtles.append("robot-turtle.png");turtles.append("sea-turtle.png");turtles.append("diamondback.png");turtles.append("electric.png");turtles.append("fuerte.png");turtles.append("groovy.png");turtles.append("hydro.svg");turtles.append("indigo.svg");turtles.append("jade.png");turtles.append("kinetic.png");*/QString images_path = (ros::package::getPath("turtlesim") + "/images/").c_str();for (int i = 0; i < turtles.size(); ++i){QImage img;img.load(images_path + turtles[i]);turtle_images_.append(img);}meter_ = turtle_images_[0].height();clear();clear_srv_ = nh_.advertiseService("clear", &TurtleFrame::clearCallback, this);reset_srv_ = nh_.advertiseService("reset", &TurtleFrame::resetCallback, this);spawn_srv_ = nh_.advertiseService("spawn", &TurtleFrame::spawnCallback, this);kill_srv_ = nh_.advertiseService("kill", &TurtleFrame::killCallback, this);ROS_INFO("Starting turtlesim with node name %s", ros::this_node::getName().c_str()) ;width_in_meters_ = (width() - 1) / meter_;height_in_meters_ = (height() - 1) / meter_;spawnTurtle("", width_in_meters_ / 2.0, height_in_meters_ / 2.0, 0);// spawn all available turtle typesif(false){for(int index = 0; index < turtles.size(); ++index){QString name = turtles[index];name = name.split(".").first();name.replace(QString("-"), QString(""));spawnTurtle(name.toStdString(), 1.0 + 1.5 * (index % 7), 1.0 + 1.5 * (index / 7), PI / 2.0, index);}}
}TurtleFrame::~TurtleFrame()
{delete update_timer_;
}bool TurtleFrame::spawnCallback(turtlesim::Spawn::Request& req, turtlesim::Spawn::Response& res)
{std::string name = spawnTurtle(req.name, req.x, req.y, req.theta);if (name.empty()){ROS_ERROR("A turtled named [%s] already exists", req.name.c_str());return false;}res.name = name;return true;
}bool TurtleFrame::killCallback(turtlesim::Kill::Request& req, turtlesim::Kill::Response&)
{M_Turtle::iterator it = turtles_.find(req.name);if (it == turtles_.end()){ROS_ERROR("Tried to kill turtle [%s], which does not exist", req.name.c_str());return false;}turtles_.erase(it);update();return true;
}bool TurtleFrame::hasTurtle(const std::string& name)
{return turtles_.find(name) != turtles_.end();
}std::string TurtleFrame::spawnTurtle(const std::string& name, float x, float y, float angle)
{return spawnTurtle(name, x, y, angle, rand() % turtle_images_.size());
}std::string TurtleFrame::spawnTurtle(const std::string& name, float x, float y, float angle, size_t index)
{std::string real_name = name;if (real_name.empty()){do{std::stringstream ss;ss << "turtle" << ++id_counter_;real_name = ss.str();} while (hasTurtle(real_name));}else{if (hasTurtle(real_name)){return "";}}TurtlePtr t(new Turtle(ros::NodeHandle(real_name), turtle_images_[index], QPointF(x, height_in_meters_ - y), angle));turtles_[real_name] = t;update();ROS_INFO("Spawning turtle [%s] at x=[%f], y=[%f], theta=[%f]", real_name.c_str(), x, y, angle);return real_name;
}void TurtleFrame::clear()
{int r = DEFAULT_BG_R;int g = DEFAULT_BG_G;int b = DEFAULT_BG_B;nh_.param("background_r", r, r);nh_.param("background_g", g, g);nh_.param("background_b", b, b);path_image_.fill(qRgb(r, g, b));update();
}void TurtleFrame::onUpdate()
{ros::spinOnce();updateTurtles();if (!ros::ok()){close();}
}void TurtleFrame::paintEvent(QPaintEvent*)
{QPainter painter(this);painter.drawImage(QPoint(0, 0), path_image_);M_Turtle::iterator it = turtles_.begin();M_Turtle::iterator end = turtles_.end();for (; it != end; ++it){it->second->paint(painter);}
}void TurtleFrame::updateTurtles()
{if (last_turtle_update_.isZero()){last_turtle_update_ = ros::WallTime::now();return;}bool modified = false;M_Turtle::iterator it = turtles_.begin();M_Turtle::iterator end = turtles_.end();for (; it != end; ++it){modified |= it->second->update(0.001 * update_timer_->interval(), path_painter_, path_image_, width_in_meters_, height_in_meters_);}if (modified){update();}++frame_count_;
}bool TurtleFrame::clearCallback(std_srvs::Empty::Request&, std_srvs::Empty::Response&)
{ROS_INFO("Clearing turtlesim.");clear();return true;
}bool TurtleFrame::resetCallback(std_srvs::Empty::Request&, std_srvs::Empty::Response&)
{ROS_INFO("Resetting turtlesim.");turtles_.clear();id_counter_ = 0;spawnTurtle("", width_in_meters_ / 2.0, height_in_meters_ / 2.0, 0);clear();return true;
}}

太长了看不懂?之前博客也没看过……用AI工具吧

要将 TurtleFrame 窗口的尺寸改大一些,您需要修改窗口的尺寸属性。在您的代码中,您设置了窗口的固定大小为 500x500 像素。要修改这个尺寸,您需要修改 setFixedSize 方法的参数。

以下是如何修改代码以将窗口大小改为 800x800 像素:

cpp

TurtleFrame::TurtleFrame(QWidget* parent, Qt::WindowFlags f)  
: QFrame(parent, f)  
, path_image_(800, 800, QImage::Format_ARGB32) // 修改了 path_image_ 的尺寸  
, path_painter_(&path_image_)  
, frame_count_(0)  
, id_counter_(0)  
{  setFixedSize(800, 800); // 修改了窗口的固定大小  setWindowTitle("CoCubeSim");  
}
TurtleFrame::TurtleFrame(QWidget* parent, Qt::WindowFlags f)
: QFrame(parent, f)
, path_image_(800, 800, QImage::Format_ARGB32) // 修改了 path_image_ 的尺寸
, path_painter_(&path_image_)
, frame_count_(0)
, id_counter_(0)
{
setFixedSize(800, 800); // 修改了窗口的固定大小
setWindowTitle("CoCubeSim");
}

请注意,修改窗口大小可能会影响到您的应用程序的其他部分,比如布局和内容的大小。如果内容不能适应新的尺寸,您可能还需要相应地调整其他部分的代码。

懂不懂C++都没啥关系。AI实力远超普通程序员,顶级大牛AI目前还pk不过。 


蝴蝶曲线搭配鹦鹉系统


Parrot OS是一款基于Debian的Linux发行版,其功能和特色主要包括以下几个方面:

  1. 安全和渗透测试工具:Parrot OS提供了广泛的安全和渗透测试工具,如Metasploit、Nmap和Aircrack-ng等。这些工具对于安全研究和网络测试至关重要。Parrot OS安全版则完全侧重于渗透测试和红队操作,包含计算机取证分析、反向工程、攻击和云渗透测试等功能。
  2. 隐私保护:Parrot OS自带Tor、Anonsurf和其他匿名工具,允许用户在网上保持匿名,这对于注重隐私的用户来说非常有用。
  3. 轻量级环境:Parrot OS使用MATE桌面环境,这是一个资源效率高、使用方便的界面。这使得它可以在资源有限的设备上运行,如老旧的电脑或低配置的硬件。
  4. 多用途使用:尽管Parrot OS主要面向安全领域,但它也提供了完整的日常使用软件套件,包括办公软件、网页浏览器和媒体工具。
  5. 系统规格:Parrot OS基于Debian 9,运行在自定义的增强的Linux内核4.5上,使用MATE桌面和Lightdm显示管理器。它还支持Qt5和.net / mono框架,以及嵌入式系统的开发框架等。
  6. 数字取证:Parrot OS支持“法证”启动选项来顺开机自动挂接,并提供了许多数字取证工具。
  7. 编程:Parrot OS支持多种编程语言、多编译器和调试器,以及嵌入式系统的开发框架等。
  8. 加密工具:Parrot OS带有定制的反取证工具,支持GPG和cryptsetup接口,还支持加密工具如LUKS、Truecrypt和VeraCrypt等。

总之,Parrot OS是一款专注于安全和隐私的Linux发行版,提供了丰富的安全和渗透测试工具、隐私保护功能、轻量级环境和多用途使用等特色。同时,它还支持数字取证、编程和加密工具等扩展功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/660122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【金蝶BI方案】用一张报表,分析生产完成情况

当老板问生产完成地怎样&#xff1f;难道还能拿出一叠报表让老板逐个细看&#xff1f;奥威-金蝶BI方案只用一张BI数据可视化报表就把整个生产完成情况给讲明白了。甚至还能满足老板想从不同角度进行分析的需求。 奥威-金蝶BI方案-BI生产完成情况报表 这张报表总结计算了生产合…

【CSS】css获取子元素的父元素,即通过子元素选择父元素(使用CSS伪类 :has() :not() )

这里写目录标题 一、:has获取第一个div获取包含 a.active 的 li获取第二个div 二、:not除了类名为active 的 a,其他的a的字体都为18px <div><h1>标题</h1></div><div><ul><li><a href"#" class"active">测…

微服务中间件 RabbitMq学习

1、为什么需要Mq 例如在用户注册业务中&#xff0c;用户注册成功后 需要发注册邮件和注册短信&#xff0c;传统的做法有两种 1.串行的方式&#xff1b;2.并行的方式 &#xff1b; 假设三个业务节点分别使用50ms&#xff0c;串行方式使用时间150ms&#xff0c;并行使用时间10…

如何编写具有完备性的测试用例 ? 具体思路是什么 ? 全套解决方案打包呈现给你 。

设计测试用例应该算是测试人员最为主要的工作之一 &#xff0c;好的测试用例往往具有覆盖性强 &#xff0c;扩展性高以及复用性好等特点 。该如何设计出好的测试用例 &#xff1f;是我们每一位测试人员需要重点思考的问题 &#xff0c;下面是我对设计测试用例设计的思考 &#…

代码随想录 Leetcode40.组合总和 II

题目&#xff1a; 代码&#xff08;首刷看解析 2024年2月1日&#xff09;&#xff1a; class Solution { public:vector<vector<int>> res;vector<int> path;void backtracking(vector<int>& candidates, int target, int startIndex, vector<…

opencv#41 轮廓检测

轮廓概念介绍 通常我们使用二值化的图像进行轮廓检测&#xff0c;对轮廓以外到内进行数字命名&#xff0c;如下图&#xff0c;最外面的轮廓命名为0&#xff0c;向内部进行扩展&#xff0c;遇到黑色白色相交区域&#xff0c;就是一个新的轮廓&#xff0c;然后依次对轮廓进行编号…

玛格全屋定制携手君子签,实现业务信息、流程、合同全面数字化

中国定制家居领导品牌——玛格全屋定制携手君子签&#xff0c;部署玛格业务系统&#xff0c;将电子签章系统与供应链上下游业务合同签署场景融合&#xff0c;通过无纸化、电子化的签署环境&#xff0c;打造业务“线上审批、签署、归档”闭环&#xff0c;助推业务减负提效。 电…

prometheus的alertmanager监控报警

监控告警&#xff1a; alert是一个单独的模块&#xff0c;需要我们单独的配置。 需要声明一个邮箱地址。配置是以configmap进行部署。 alert 实验&#xff1a; vim alert-cfg.yaml apiVersion: v1 kind: ConfigMap metadata:name: alertmanagernamespace: monitor-sa data…

跟着cherno手搓游戏引擎【16】Camera和Uniform变量的封装

相机封装&#xff1a; OrthographicCamera.h: #pragma once #include <glm/glm.hpp> namespace YOTO {class OrthographicCamera{public:OrthographicCamera(float left,float right , float bottom,float top);const glm::vec3& GetPosition()const { return m_Pos…

对同一文件多次mmap

abstract 问&#xff1a;对同一个文件多次mmap&#xff0c;返回的地址相同吗? 答&#xff1a;不相同 code #ifdef __linux__#include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> …

Vue-49、Vue技术实现动画效果

1、首先&#xff0c;在Vue项目中的src/components文件夹下创建一个名为AnimatedBox.vue的文件。 2、编辑AnimatedBox.vue文件&#xff0c;添加以下代码&#xff1a; <template><div class"animated-box" click"toggle"><transition name&q…

【C++】STL优先级队列(priority_queue)

priority_queue 基本介绍 priority_queue就是优先级队列。其头文件就是queue&#xff0c;但是队列和优先级队列关系不大&#xff0c;两个是不同的数据结构。但二者都是适配器&#xff0c;容器适配器。 优先级队列中存放的数据是有优先级的。 其内部有以下成员方法&#xff0c…

使用post-css实现移动端适配

介绍移动端适配以及适配方案 适配原因 移动端不像PC端,有足够大的屏幕展示较多的内容不同的移动端设备&#xff0c;有不同屏幕宽度同样大小的页面元素在不同屏幕宽度设备展示时&#xff0c;布局就会错乱有些元素没有展示在可视范围内有些元素不能撑满整个屏幕&#xf…

【Linux】初始进程地址空间

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 目录 一、再谈fork二、程序地址空间2.1代码验证 三、虚拟地址&am…

成熟的汽车制造供应商协同平台 要具备哪些功能特性?

汽车行业是一个产业链长且“重”的行业&#xff0c;整个业务流程包括了研发、设计、采购、库存、生产、销售、售后等一系列环节&#xff0c;在每一个环节都涉及到很多信息交换的需求。对内要保证研发、采购、营销等业务环节信息流通高效安全&#xff0c;对外要与上、下游合作伙…

Python编程实验一:流程控制结构

目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 第3题 第4题 四、实验结果分析与体会 一、实验目的与要求 &#xff08;1&#xff09;通过本次实验&#xff0c;学生应掌握多分支语句 if …elif…else结构的用法&#xff1b; &…

vue3/vue2中自定义指令不可输入小数点.

import { directive } from vueconst noDecimal {mounted(el) {el.addEventListener(keypress, (e) > {if (e.key .) {e.preventDefault() }})} }// 使用自定义指令 directive(no-decimal, noDecimal)使用 标签上添加 v-no-decimal <el-input…

重磅!讯飞星火V3.5正式发布,3大核心能力超GPT-4 Turbo!

1月30日&#xff0c;科大讯飞召开星火认知大模型V3.5升级发布会&#xff0c;这是国内首个基于全国产算力训练的多模态认知大模型。科大讯飞董事长刘庆峰先生、研究院院长刘聪先生出席了大会&#xff0c;并对最新产品进行了多维度解读。 讯飞星火V3.5的7大核心能力实现全面大幅…

【Python】P2 Python3 安装使用

目录 新手教程开发教程 本篇博客文章划分为两个主要部分&#xff1a; 【新手教程】旨在为 Python 编程的新手提供指导&#xff0c;适合于初学者入门&#xff0c;但不太适合用于开发大型项目&#xff1b;【开发教程】则面向那些已经有项目开发经验或者希望迅速提升开发技能的读…

BUUCTF-Real-[ThinkPHP]5-Rce

1、ThinkPHP检测工具 https://github.com/anx0ing/thinkphp_scan 漏洞检测 通过漏洞检测&#xff0c;我们发现存在rce漏洞&#xff01; 2、漏洞利用 ---- [!] Name: Thinkphp5 5.0.22/5.1.29 Remote Code Execution VulnerabilityScript: thinkphp5022_5129.pyUrl: http://n…