tag:blogger.com,1999:blog-38580913161315087532024-03-05T00:37:51.644-08:00Me and the robotsUnknownnoreply@blogger.comBlogger55125tag:blogger.com,1999:blog-3858091316131508753.post-8911001471592369732018-12-04T21:43:00.001-08:002018-12-04T21:43:02.845-08:00<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<hr>
<h2 id="layout-posttitle-use-jinja-to-create-gazebo-sdf-filescategories-gazebotags-vscode-gazebo-jinja-sdf">layout: post
title: Use Jinja to create gazebo sdf files
categories: gazebo
tags: [vscode, gazebo, jinja, sdf]</h2>
<h2 id="jinja-101">Jinja 101</h2>
<p>Jinja2 is a template engine</p>
<h3 id="install">Install</h3>
<pre class="hljs"><code><div>pip install Jinja2
</div></code></pre>
<h3 id="syntax">Syntax</h3>
<pre class="hljs"><code><div>{{ }} Print and Evaluate an expression
{% %} Statement
{# #} Comments
</div></code></pre>
<h3 id="set-variable">Set variable</h3>
<pre class="hljs"><code><div><span class="xml"></span><span class="hljs-template-tag">{% <span class="hljs-name">set</span> title='hello world' %}</span><span class="xml">
</span><span class="hljs-template-variable">{{ title }}</span><span class="xml">
</span></div></code></pre>
<h3 id="control">Control</h3>
<ul>
<li>for loop</li>
</ul>
<pre class="hljs"><code><div>{% <span class="hljs-built_in">set</span> names = [<span class="hljs-string">'a'</span>, <span class="hljs-string">'b'</span>, <span class="hljs-string">'c'</span>]%}
{% <span class="hljs-keyword">for</span> name <span class="hljs-keyword">in</span> names %}
{{ loop.index }}: {{name}}
{% endfor %}
<span class="hljs-comment"># Output result</span>
1: a
2: b
3: c
</div></code></pre>
<table>
<thead>
<tr>
<th>Variable</th>
<th>Desc</th>
</tr>
</thead>
<tbody>
<tr>
<td>loop.index</td>
<td>index loop start with 1</td>
</tr>
<tr>
<td>loop.index0</td>
<td>index loop</td>
</tr>
</tbody>
</table>
<ul>
<li>if statment</li>
</ul>
<pre class="hljs"><code><div>{% set name='' %}
{% if name %}
{{ name }}
{% else %}
no name enter
{% endif %}
</div></code></pre>
<h3 id="white-space-control">White space control</h3>
<p>use + and - are control whitespace</p>
<ul>
<li>Run the loop example with hyphen at the end of line</li>
</ul>
<pre class="hljs"><code><div>{% <span class="hljs-built_in">set</span> names = [<span class="hljs-string">'a'</span>, <span class="hljs-string">'b'</span>, <span class="hljs-string">'c'</span>] -%}
{% <span class="hljs-keyword">for</span> name <span class="hljs-keyword">in</span> names -%}
{{ loop.index }}: {{name}}
{% endfor -%}
<span class="hljs-comment"># same output without line spaces</span>
1: a
2: b
3: c
</div></code></pre>
<h3 id="macro">Macro</h3>
<pre class="hljs"><code><div>{%- macro box(x, y, z) -%}
<geometry>
<box>
<size>{{x}} {{y}} {{z}}</size>
</box>
</geometry>
{%- endmacro -%}
<span class="hljs-comment"># Call the macro</span>
{{ box(1,1,1) }}
</div></code></pre>
<h2 id="cli-for-jinja2">CLI for Jinja2</h2>
<p>A CLI interface to Jinja2</p>
<ul>
<li>install</li>
</ul>
<pre class="hljs"><code><div>sudo pip install jinja2-cli
</div></code></pre>
<ul>
<li>usage</li>
</ul>
<pre class="hljs"><code><div>Usage: jinja2 [options] <input template> <input data>
</div></code></pre>
<h3 id="demos">Demos</h3>
<ul>
<li>Template</li>
</ul>
<pre class="hljs"><code><div>{% if foo is defined -%}
foo difined and has value: define {{ foo }}
{% endif -%}
</div></code></pre>
<ul>
<li>Test</li>
</ul>
<pre class="hljs"><code><div>jinja2 -D foo=foo_value hello.txt.jinja
<span class="hljs-comment"># result</span>
foo difined and has value: define foo_value
</div></code></pre>
<h2 id="tips">Tips</h2>
<ul>
<li>Install vscode ext for better syntax color</li>
</ul>
<p><img src="/images/2018-12-04-23-16-27.png" alt=""></p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://overiq.com/flask-101/basics-of-jinja-template-language/#attributes-and-method">Basics of Jinja Template Language</a></li>
</ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-89524848112972966982018-11-27T13:30:00.001-08:002018-11-27T13:31:16.987-08:00Python docker vscode and remote debugging<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<ul>
<li>Docker file (Dockerfile)
<ul>
<li>install project requirements</li>
<li>base on python 3.6</li>
</ul>
</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">FROM</span> python:<span class="hljs-number">3.6</span>-alpine
<span class="hljs-keyword">COPY</span><span class="bash"> requirements.txt /tmp/requirements.txt
</span><span class="hljs-keyword">WORKDIR</span><span class="bash"> /tmp
</span><span class="hljs-keyword">RUN</span><span class="bash"> pip install -r requirements.txt
</span>
<span class="hljs-keyword">WORKDIR</span><span class="bash"> /project
</span><span class="hljs-keyword">CMD</span><span class="bash"> [<span class="hljs-string">"sh"</span>]
</span></div></code></pre>
<ul>
<li>requirements.txt
<ul>
<li>ptvsd: version 4.1.4 (4.2.X version has issue with run debugging multiple times)</li>
</ul>
</li>
</ul>
<pre class="hljs"><code><div>ptvsd==4.1.4
</div></code></pre>
<ul>
<li>Docker compose file base on image
image: image name
build: Docker file path
volumes: shared project note that host folder point to current parent folder the remote path add project folder name automaticall</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-attr">version:</span> <span class="hljs-string">'2'</span>
<span class="hljs-attr">services:</span>
<span class="hljs-attr"> dev-image:</span>
<span class="hljs-attr"> image:</span> <span class="hljs-string">python_36</span>
<span class="hljs-attr"> build:</span> <span class="hljs-string">.</span>
<span class="hljs-attr"> ports:</span>
<span class="hljs-bullet"> -</span> <span class="hljs-number">3000</span><span class="hljs-string">:3000</span>
<span class="hljs-attr"> privileged:</span> <span class="hljs-literal">true</span>
<span class="hljs-attr"> container_name:</span> <span class="hljs-string">pydev</span>
<span class="hljs-attr"> volumes:</span>
<span class="hljs-bullet"> -</span> <span class="hljs-string">../:/project</span>
</div></code></pre>
<ul>
<li>vscode launch.json file</li>
</ul>
<pre class="hljs"><code><div>{
<span class="hljs-attr">"name"</span>: <span class="hljs-string">"Attach (Remote Debug)"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"python"</span>,
<span class="hljs-attr">"request"</span>: <span class="hljs-string">"attach"</span>,
<span class="hljs-attr">"port"</span>: <span class="hljs-number">3000</span>,
<span class="hljs-attr">"host"</span>: <span class="hljs-string">"localhost"</span>,
<span class="hljs-attr">"pathMappings"</span>: [
{
<span class="hljs-attr">"localRoot"</span>: <span class="hljs-string">"${workspaceFolder}"</span>,
<span class="hljs-attr">"remoteRoot"</span>: <span class="hljs-string">"/project/"</span>
}
]
}
</div></code></pre>
<ul>
<li>python simple example</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">import</span> ptvsd
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">import</span> os
print(<span class="hljs-string">"Waiting to attach"</span>)
address = (<span class="hljs-string">'0.0.0.0'</span>, <span class="hljs-number">3000</span>)
ptvsd.enable_attach(address)
ptvsd.wait_for_attach()
time.sleep(<span class="hljs-number">2</span>)
x = <span class="hljs-number">1</span>
print(x)
</div></code></pre>
<h2 id="run-docker-tasksjson">run docker (tasks.json)</h2>
<ul>
<li>start docker
<ul>
<li>--service-port:</li>
<li>dev-image: compose file service name</li>
<li>--name: container name</li>
</ul>
</li>
</ul>
<pre class="hljs"><code><div>docker-compose -f docker-compose.yml run --service-ports --name devenv dev-image
</div></code></pre>
<ul>
<li>run remote application</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#docker exec -it devenv python "<relative path from working directory>/simple.py"</span>
docker <span class="hljs-built_in">exec</span> -it devenv python <span class="hljs-string">"python_remote/src/simple.py"</span>
</div></code></pre>
<ul>
<li>stop docker</li>
</ul>
<pre class="hljs"><code><div>docker-compose -f docker-compose.yml down
</div></code></pre>
<pre class="hljs"><code><div>{
<span class="hljs-attr">"version"</span>: <span class="hljs-string">"2.0.0"</span>,
<span class="hljs-attr">"tasks"</span>: [
{
<span class="hljs-attr">"label"</span>: <span class="hljs-string">"start_docker"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"shell"</span>,
<span class="hljs-attr">"options"</span>: {
<span class="hljs-attr">"cwd"</span>: <span class="hljs-string">"${workspaceFolder}/python_remote"</span>
},
<span class="hljs-attr">"command"</span>: <span class="hljs-string">"docker-compose -f docker-compose.yml run --service-ports --name devenv dev-image sh"</span>,
<span class="hljs-attr">"problemMatcher"</span>: []
},
{
<span class="hljs-attr">"label"</span>: <span class="hljs-string">"stop_docker"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"shell"</span>,
<span class="hljs-attr">"command"</span>: <span class="hljs-string">"docker-compose -f docker-compose.yml down"</span>,
<span class="hljs-attr">"options"</span>: {
<span class="hljs-attr">"cwd"</span>: <span class="hljs-string">"${workspaceFolder}/python_remote"</span>
},
<span class="hljs-attr">"problemMatcher"</span>: []
},
{
<span class="hljs-attr">"label"</span>: <span class="hljs-string">"run remote"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"shell"</span>,
<span class="hljs-attr">"command"</span>:[<span class="hljs-string">"docker exec devenv"</span>, <span class="hljs-string">"python"</span>, <span class="hljs-string">"${relativeFile}"</span>],
<span class="hljs-attr">"problemMatcher"</span>: []
}
]
}
</div></code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-78134244681663528162018-11-21T22:55:00.000-08:002018-11-23T03:38:28.977-08:00Start Gazebo and PX4 SITL separately<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<ul>
<li>Terminal 1</li>
</ul>
<pre class="hljs"><code><div>make posix_sitl_default gazebo no_sim=1
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwDx-RVvN7qegTdYjJFCtoeIWLdrhwKad8d8Bo4stmNaqwBqjDuBupoe55TJZaDrdtNlhPtMdrTDz-1O4Or9cWTTlwJUZjKLjCleWeN0njLAtQKffq4mepcDKkY44K4xP1Ix4gwL0gr_0/s1600/2018-11-22-07-18-33.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwDx-RVvN7qegTdYjJFCtoeIWLdrhwKad8d8Bo4stmNaqwBqjDuBupoe55TJZaDrdtNlhPtMdrTDz-1O4Or9cWTTlwJUZjKLjCleWeN0njLAtQKffq4mepcDKkY44K4xP1Ix4gwL0gr_0/s400/2018-11-22-07-18-33.png" width="400" height="82" data-original-width="984" data-original-height="201" /></a></div></p>
<ul>
<li>Terminal 2</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment"># PX4 gazebo plugins</span>
<span class="hljs-built_in">export</span> GAZEBO_PLUGIN_PATH=<span class="hljs-variable">${GAZEBO_PLUGIN_PATH}</span>:/home/user/px4/Firmware/build/posix_sitl_default/build_gazebo
<span class="hljs-built_in">export</span> GAZEBO_MODEL_PATH=<span class="hljs-variable">${GAZEBO_MODEL_PATH}</span>:/home/user/px4/Firmware/Tools/sitl_gazebo/models
<span class="hljs-comment"># add iris model into warehouse world</span>
<span class="hljs-comment">#run</span>
gazebo --verbose /home/user/px4/Firmware/Tools/sitl_gazebo/worlds/warehouse.world
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTJaG0Ly-FVGUo95cQyduAIRkABih16pZ38VTie1e_bUU3dkZpq6NL8B_i7EeQTrZJ86dnmlViCWaBtaK9Ju3_tTfOGF217nQCXGHe4uzUQNXZ81auvFlkQKyn87VRwQFxA6wWxvP6PRg/s1600/2018-11-22-07-19-41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTJaG0Ly-FVGUo95cQyduAIRkABih16pZ38VTie1e_bUU3dkZpq6NL8B_i7EeQTrZJ86dnmlViCWaBtaK9Ju3_tTfOGF217nQCXGHe4uzUQNXZ81auvFlkQKyn87VRwQFxA6wWxvP6PRg/s400/2018-11-22-07-19-41.png" width="400" height="225" data-original-width="1600" data-original-height="900" /></a></div></p>
<h3 id="add-iris-into-warehouseworld">Add iris into warehouse.world</h3>
<pre class="hljs"><code><div><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span> <span class="hljs-meta">?></span></span>
<span class="hljs-tag"><<span class="hljs-name">sdf</span> <span class="hljs-attr">version</span>=<span class="hljs-string">"1.5"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">world</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"default"</span>></span>
<span class="hljs-comment"><!-- A global light source --></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">uri</span>></span>model://sun<span class="hljs-tag"></<span class="hljs-name">uri</span>></span>
<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-comment"><!-- A ground plane --></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">uri</span>></span>model://ground_plane<span class="hljs-tag"></<span class="hljs-name">uri</span>></span>
<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">uri</span>></span>model://asphalt_plane<span class="hljs-tag"></<span class="hljs-name">uri</span>></span>
<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-comment"><!--add iris model for example --></span>
<span class="hljs-tag"><<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">uri</span>></span>model://iris<span class="hljs-tag"></<span class="hljs-name">uri</span>></span>
<span class="hljs-tag"><<span class="hljs-name">pose</span>></span>1.01 0.98 0.83 0 0 1.14<span class="hljs-tag"></<span class="hljs-name">pose</span>></span>
<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
</div></code></pre>
<h1 id="note">Note</h1>
<p>Try to add model with gz command, the model add into the world model list but not visible</p>
<pre class="hljs"><code><div>gz model --spawn-file=iris.sdf --model-name=iaaa -p 1.01 0.98 0.83 0 0 1.14
</div></code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-8982114859276776102018-11-18T12:15:00.001-08:002018-11-18T12:15:28.973-08:00Gazebo ImageStamped message to OpenCV<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h1 id="convert-gazebo-camera-imagestamped-message-to-opencv-mat">Convert Gazebo camera ImageStamped message to OpenCV Mat</h1>
<p>Client code subscribe to gazebo image topic message type <code>ImageStamped</code>
and view the image as opencv mat</p>
<ul>
<li>Terminal 1 (run gazebo)</li>
</ul>
<pre class="hljs"><code><div>make posix_sitl_default gazebo_typhoon_h480
</div></code></pre>
<ul>
<li>Termianl 2 (view topics and topic message)</li>
</ul>
<pre class="hljs"><code><div>gz topic -l
<span class="hljs-comment"># </span>
/gazebo/default/typhoon_h480/camera/link/irlock
/gazebo/default/typhoon_h480/cgo3_camera_link/camera/cmd
/gazebo/default/typhoon_h480/cgo3_camera_link/camera/image
/gazebo/default/typhoon_h480/cgo3_camera_link/camera_imu/imu
/gazebo/default/typhoon_h480/cgo3_camera_link/wrench
/gazebo/default/typhoon_h480/cgo3_horizontal_arm_link/wr
<span class="hljs-comment">#</span>
gz topic -i /gazebo/default/typhoon_h480/cgo3_camera_link/camera/image
Type: gazebo.msgs.ImageStamped
</div></code></pre>
<ul>
<li>Terminal 2 (run the app)</li>
</ul>
<pre class="hljs"><code><div>cd build
cmake ..
make
../bin/viewer
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLxc4wtK3JsW-iJafeB9jL5XQiew1oEHLvLz212-eKMq6QswhYk0Vn0n42RwLzm5fUVhtvjzHWsoHwKvH-Fk-cS0HOuCFoI34MYrqlvQArefhdn_7yyprQ2_Y4FgnMSkVdhHcDoi0AE04/s1600/2018-11-18-21-54-28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjLxc4wtK3JsW-iJafeB9jL5XQiew1oEHLvLz212-eKMq6QswhYk0Vn0n42RwLzm5fUVhtvjzHWsoHwKvH-Fk-cS0HOuCFoI34MYrqlvQArefhdn_7yyprQ2_Y4FgnMSkVdhHcDoi0AE04/s400/2018-11-18-21-54-28.png" width="291" height="400" data-original-width="663" data-original-height="912" /></a></div></p>
<ul>
<li>callback function</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">cb</span><span class="hljs-params">(ConstImageStampedPtr &msg)</span>
</span>{
<span class="hljs-keyword">int</span> width;
<span class="hljs-keyword">int</span> height;
<span class="hljs-keyword">char</span> *data;
width = (<span class="hljs-keyword">int</span>) msg->image().width();
height = (<span class="hljs-keyword">int</span>) msg->image().height();
<span class="hljs-comment">//+1 for null terminate</span>
data = <span class="hljs-keyword">new</span> <span class="hljs-keyword">char</span>[msg->image().data().length() + <span class="hljs-number">1</span>];
<span class="hljs-built_in">memcpy</span>(data, msg->image().data().c_str(), msg->image().data().length());
<span class="hljs-comment">//gazebo output rgb data</span>
<span class="hljs-comment">//PixelFormat.R8G8B8</span>
cv::<span class="hljs-function">Mat <span class="hljs-title">image</span><span class="hljs-params">(height, width, CV_8UC3, data)</span></span>;
cv::imshow(<span class="hljs-string">"camera"</span>, image);
cv::waitKey(<span class="hljs-number">1</span>);
<span class="hljs-keyword">delete</span> data; <span class="hljs-comment">// DO NOT FORGET TO DELETE THIS, </span>
<span class="hljs-comment">// ELSE GAZEBO WILL TAKE ALL YOUR MEMORY</span>
}
</div></code></pre>
<pre class="hljs"><code><div><span class="hljs-keyword">cmake_minimum_required</span>(VERSION <span class="hljs-number">2.8</span>)
<span class="hljs-keyword">project</span>(gz_viewer)
<span class="hljs-keyword">set</span>(CMAKE_CXX_STANDARD <span class="hljs-number">11</span>)
<span class="hljs-keyword">set</span>(EXECUTABLE_OUTPUT_PATH <span class="hljs-variable">${CMAKE_SOURCE_DIR}</span>/bin)
<span class="hljs-keyword">find_package</span>(gazebo REQUIRED)
<span class="hljs-keyword">include_directories</span>(<span class="hljs-variable">${GAZEBO_INCLUDE_DIRS}</span>)
<span class="hljs-keyword">link_directories</span>(<span class="hljs-variable">${GAZEBO_LIBRARY_DIRS}</span>)
list(APPEND CMAKE_CXX_FLAGS <span class="hljs-string">"${GAZEBO_CXX_FLAGS}"</span>)
<span class="hljs-keyword">find_package</span>( OpenCV REQUIRED )
<span class="hljs-keyword">add_executable</span>(viewer viewer.cpp)
<span class="hljs-keyword">target_link_libraries</span>(viewer <span class="hljs-variable">${OpenCV_LIBS}</span> <span class="hljs-variable">${GAZEBO_LIBRARIES}</span> pthread)
</div></code></pre>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="http://answers.gazebosim.org/question/14619/how-to-convert-gazebos-constimagestamped-to-cvmat/">How to convert Gazebo's ConstImageStamped to cv::Mat?</a></li>
<li><a href="https://bitbucket.org/osrf/gazebo/src/b71f149cc546/examples/stand_alone/listener/?at=gazebo6">gz client standalone listener</a></li>
<li><a href="https://github.com/amire2000/projects/tree/master/gazebo_demos/image_viewer">my source code</a></li>
</ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-3181406632785179842018-11-15T02:46:00.002-08:002018-11-15T02:46:43.964-08:00MAVLink wireshark lua plugins<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h1 id="write-wireshark-extension-for-mavlink">Write wireshark extension for mavlink</h1>
<p>Write wireshark plugin to parse and display mavlink protocol.
Plugin can be write with lua script language or C/C++</p>
<h2 id="install-and-config-wireshark-to-run-as-non-root-user">install and config wireshark to run as non root user</h2>
<pre class="hljs"><code><div>sudo apt install wireshark
<span class="hljs-comment"># Config wireshark to run as non root user</span>
sudo groupadd wireshark
sudo usermod -a -G wireshark <span class="hljs-variable">$USER</span>
sudo chgrp wireshark /usr/bin/dumpcap
sudo chmod o-rx /usr/bin/dumpcap
sudo <span class="hljs-built_in">setcap</span> <span class="hljs-string">'CAP_NET_RAW+eip CAP_NET_ADMIN+eip'</span> /usr/bin/dumpcap
sudo <span class="hljs-built_in">getcap</span> /usr/bin/dumpcap
</div></code></pre>
<ul>
<li>Logout and login again</li>
<li>Note: the command: <code>sudo dpkg-reconfigure wireshark-common</code> not working for me <img class="emoji" alt="frowning" src="data:image/png;base64,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" /></li>
</ul>
<h2 id="hello-lua---wireshark-dissector">Hello lua - Wireshark dissector</h2>
<p>Dissector are meant to analyze some part of a packet's data</p>
<ul>
<li>Create file <code>hello.lua</code></li>
<li>paste</li>
</ul>
<pre class="hljs"><code><div>print "hello lua\n\n\n"
</div></code></pre>
<ul>
<li>run</li>
</ul>
<pre class="hljs"><code><div>tshark -v -Xlua_script:<path>/hello.lua
<span class="hljs-comment">#output</span>
ne/Tools/wireshark/hello.lua
hello lua
TShark (Wireshark)
</div></code></pre>
<h2 id="mavlink-20-protocol-structure">Mavlink 2.0 protocol structure</h2>
<p><a href="https://mavlink.io/en/about/overview.html">MAVLink 2 Packet Format</a>
<img src="https://github.com/amire2000/x4drone/raw/master/docs/images/2018-11-15-09-00-43.png" alt=""></p>
<h2 id="lua-dissector">Lua dissector</h2>
<pre class="hljs"><code><div><span class="hljs-comment">-- </span>
mavlink_protocol = Proto(<span class="hljs-string">"Mavlink"</span>, <span class="hljs-string">"Mavlink protocol"</span>)
mavlink_protocol.fileds = {}
<span class="hljs-comment">-- call for every packet</span>
<span class="hljs-comment">-- buffer: packet data to dissect</span>
<span class="hljs-comment">-- pinfo: columns of the packt </span>
<span class="hljs-comment">-- tree: packet tree items</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">mavlink_protocol.dissector</span><span class="hljs-params">(buffer, pinfo, tree)</span></span>
length = buffer:<span class="hljs-built_in">len</span>()
<span class="hljs-keyword">if</span> length == <span class="hljs-number">0</span> <span class="hljs-keyword">then</span> <span class="hljs-keyword">return</span> <span class="hljs-keyword">end</span>
<span class="hljs-comment">-- change protocol column value from tcp to Mavlink</span>
pinfo.cols.protocol = mavlink_protocol.name
<span class="hljs-comment">-- Add subtree item </span>
<span class="hljs-keyword">local</span> subtree = tree:add(mavlink_protocol, buffer(), <span class="hljs-string">"Mavlink protocol data"</span>)
<span class="hljs-keyword">end</span>
<span class="hljs-comment">-- Assign protocol to port</span>
<span class="hljs-keyword">local</span> udp_port = DissectorTable.get(<span class="hljs-string">"udp.port"</span>)
udp_port:add(<span class="hljs-number">15540</span>, mavlink_protocol)
</div></code></pre>
<p><img src="https://github.com/amire2000/x4drone/raw/master/docs/images/2018-11-15-09-13-37.png" alt="">
<img src="https://github.com/amire2000/x4drone/raw/master/docs/images/2018-11-15-09-13-56.png" alt=""></p>
<h3 id="source-poc">source poc</h3>
<p><a href="https://github.com/amire2000/x4drone/blob/master/Tools/wireshark/mavlink.lua">poc source code</a></p>
<h3 id="test-in-wireshark">Test in wireshark</h3>
<pre class="hljs"><code><div>wireshark -i lo -f "udp port 14540" -Xlua_script:<path>/mavlink.lua
</div></code></pre>
<p><img src="https://github.com/amire2000/x4drone/raw/master/docs/images/2018-11-15-10-48-32.png" alt=""></p>
<h2 id="using-mavlink-generator">Using mavlink generator</h2>
<p><a href="https://mavlink.io/kr/getting_started/generate_libraries.html">MAVLink generator tool</a></p>
<p><img src="https://github.com/amire2000/x4drone/raw/master/docs/images/2018-11-15-12-13-38.png" alt=""></p>
<ul>
<li>XML: select target XML from <code>mavlink/message_definitions/1.0</code></li>
<li>Out: output directory</li>
<li>Language: wlua</li>
<li>protocolo: 2.0</li>
</ul>
<p>Note: minimum.xml parse only <code>heartbeat</code> message</p>
<h2 id="note">Note</h2>
<p>Generated code has bug parse msgid (maybe data from pixhawk are little endian)
for know changed the code</p>
<ul>
<li><code>rshift</code> to <code>lshift</code></li>
<li>shidt index 2,3 and not 1,2</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">local</span> msgidt1 = buffer(offset,<span class="hljs-number">1</span>):uint()
offset = offset + <span class="hljs-number">1</span>
<span class="hljs-keyword">local</span> msgidt2 = buffer(offset,<span class="hljs-number">1</span>):uint()
offset = offset + <span class="hljs-number">1</span>
<span class="hljs-keyword">local</span> msgidt3 = buffer(offset,<span class="hljs-number">1</span>):uint()
msgidt1 = bit.rshift(msgidt1, <span class="hljs-number">8</span>)
msgidt2 = bit.rshift(msgidt2, <span class="hljs-number">16</span>)
msgid = msgidt1+msgidt2+msgidt3
header:add(f.msgid, msgid)
</div></code></pre>
<pre class="hljs"><code><div><span class="hljs-keyword">local</span> msgidt1 = buffer(offset,<span class="hljs-number">1</span>):uint()
offset = offset + <span class="hljs-number">1</span>
<span class="hljs-keyword">local</span> msgidt2 = buffer(offset,<span class="hljs-number">1</span>):uint()
offset = offset + <span class="hljs-number">1</span>
<span class="hljs-keyword">local</span> msgidt3 = buffer(offset,<span class="hljs-number">1</span>):uint()
msgidt2 = bit.lshift(msgidt2, <span class="hljs-number">8</span>)
msgidt3 = bit.lshift(msgidt3, <span class="hljs-number">16</span>)
msgid = msgidt1+msgidt2+msgidt3
header:add(f.msgid, msgid)
</div></code></pre>
<p><img src="https://github.com/amire2000/x4drone/raw/master/docs/images/2018-11-15-12-34-53.png" alt=""></p>
<h2 id="tip-run-sitl-without-gui">Tip: run SITL without gui</h2>
<ul>
<li>gazebo</li>
<li>jmavsim</li>
</ul>
<h3 id="gazebo">Gazebo</h3>
<ul>
<li>run without gui</li>
</ul>
<pre class="hljs"><code><div>HEADLESS=1 make posix_sitl_default gazebo_<model>
</div></code></pre>
<h3 id="jmavsim">jMAVsim</h3>
<ul>
<li>Disabled jmavsim GUI</li>
</ul>
<pre class="hljs"><code><div>setViewType(VIEW_TYPE);
setZoomMode(ZOOM_MODE);
setVisible(<span class="hljs-keyword">true</span>); <span class="hljs-comment">// -> setVisible(false)</span>
splitPane.resetToPreferredSizes();
toggleReportPanel(<span class="hljs-keyword">false</span>);
resetView();
</div></code></pre>
<ul>
<li>
<p>Compile jmavsim
from <code><>/Firmware/Tools/jMAVSim</code>
run <code>ant</code> to compile java</p>
</li>
<li>
<p>Run SITL</p>
</li>
</ul>
<pre class="hljs"><code><div>make posix_sitl_default jmavsim
</div></code></pre>
<h2 id="resource">Resource</h2>
<ul>
<li><a href="https://mika-s.github.io/wireshark/lua/dissector/2017/11/04/creating-a-wireshark-dissector-in-lua-1.html">Creating a Wireshark dissector in Lua - part 1</a></li>
</ul>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-39039742366328276952018-11-09T23:06:00.001-08:002018-11-09T23:06:22.877-08:00Gazebo topic subscribe<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<p>Gazebo communicates on TCP/IP sockets Messages are sent on named channels called topics via publishers. On the other side of a topic are subscribers, which receive callbacks when messages arrive.</p>
<p><code>gz topic -l</code> list the topic on running system</p>
<h2 id="subscriber">Subscriber</h2>
<p>Demo code subscribe to <code>/gazebo/default/world_stats</code></p>
<ul>
<li>topic list</li>
</ul>
<pre class="hljs"><code><div>gz topic -l
....
/gazebo/default/world_control
/gazebo/default/world_stats
/gazebo/motor_failure_num
/gazebo/server/control
/gazebo/world/modify
</div></code></pre>
<ul>
<li>topic info</li>
</ul>
<pre class="hljs"><code><div>gz topic -i /gazebo/default/world_stats
Type: gazebo.msgs.WorldStatistics
Publishers:
192.168.2.200:39165
Subscribers:
</div></code></pre>
<ul>
<li>topic message view</li>
</ul>
<pre class="hljs"><code><div># gz topic -e (echo)
gz topic -v /gazebo/default/world_stats
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhemD3MzliJOfqQzueVEt3CmFF89hpMXGyOoGjm3gF2UBfQ8ryt_Q16yWELEZ617HyQQovJXOaQiYfr9mAMqwpNNjwcWUPvw_WLaKeQ-nAIdOvG6S-TryTaLdUIKF94ln82i7dio8peS-s/s1600/2018-11-10-08-12-15.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;">
<img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhemD3MzliJOfqQzueVEt3CmFF89hpMXGyOoGjm3gF2UBfQ8ryt_Q16yWELEZ617HyQQovJXOaQiYfr9mAMqwpNNjwcWUPvw_WLaKeQ-nAIdOvG6S-TryTaLdUIKF94ln82i7dio8peS-s/s320/2018-11-10-08-12-15.png" width="449" height="248" data-original-width="449" data-original-height="348" /></a></div></p>
<br/>
<br/>
<h3 id="write-code">Write code</h3>
<ul>
<li>
<p><a href="http://gazebosim.org/tutorials?tut=topics_subscribed">Reference</a></p>
</li>
<li>
<p><a href="https://github.com/amire2000/x4drone/tree/master/examples/gazebo">My GIT</a></p>
</li>
<li>
<p>cmake file (not include project name and minimum_required)</p>
</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">find_package</span>(gazebo REQUIRED)
<span class="hljs-keyword">include_directories</span>(<span class="hljs-variable">${GAZEBO_INCLUDE_DIRS}</span>)
<span class="hljs-keyword">link_directories</span>(<span class="hljs-variable">${GAZEBO_LIBRARY_DIRS}</span>)
list(APPEND CMAKE_CXX_FLAGS <span class="hljs-string">"${GAZEBO_CXX_FLAGS}"</span>)
<span class="hljs-keyword">add_executable</span>(sub_demo sub_demo.cpp)
<span class="hljs-keyword">target_link_libraries</span>(sub_demo <span class="hljs-variable">${GAZEBO_LIBRARIES}</span> pthread)
</div></code></pre>
<ul>
<li>sub_demo source</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><gazebo-7/gazebo/transport/TransportIface.hh></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><gazebo-7/gazebo/msgs/msgs.hh></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><gazebo-7/gazebo/gazebo_client.hh></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><iostream></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><csignal></span></span>
<span class="hljs-keyword">const</span> <span class="hljs-built_in">std</span>::<span class="hljs-built_in">string</span> TOPIC = <span class="hljs-string">"/gazebo/default/world_stats"</span>;
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">my_shutdown</span><span class="hljs-params">(<span class="hljs-keyword">int</span> signal)</span></span>{
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span><<<span class="hljs-string">"shutdown gazebo client"</span> << <span class="hljs-built_in">std</span>::<span class="hljs-built_in">endl</span>;
gazebo::client::shutdown();
<span class="hljs-built_in">exit</span>(<span class="hljs-number">0</span>);
}
<span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">cb</span><span class="hljs-params">(ConstWorldStatisticsPtr &_msg)</span></span>{
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> << _msg->DebugString() << <span class="hljs-built_in">std</span>::<span class="hljs-built_in">endl</span>;
}
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">(<span class="hljs-keyword">int</span> argc, <span class="hljs-keyword">char</span> **argv)</span></span>{
signal (SIGINT, my_shutdown);
gazebo::client::setup(argc, argv);
<span class="hljs-comment">//create node for communication</span>
gazebo::transport::<span class="hljs-function">NodePtr <span class="hljs-title">node</span><span class="hljs-params">(<span class="hljs-keyword">new</span> gazebo::transport::Node()</span>)</span>;
node->Init();
<span class="hljs-comment">//subscribe to topic</span>
gazebo::transport::SubscriberPtr sub = node->Subscribe(TOPIC, cb);
<span class="hljs-keyword">while</span>(<span class="hljs-literal">true</span>){
gazebo::common::Time::MSleep(<span class="hljs-number">100</span>);
}
<span class="hljs-keyword">return</span> <span class="hljs-number">0</span>;
}
</div></code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-67224746312425103882018-11-05T14:35:00.000-08:002018-11-14T11:38:49.779-08:00SITL Gazebo camera stream<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h1 id="sitl-gazebo-camera-stream">SITL Gazebo camera stream</h1>
<ul>
<li><a href="https://dev.px4.io/en/simulation/gazebo.html">px4 gazebo</a></li>
</ul>
<h2 id="prerequisites">Prerequisites</h2>
<pre class="hljs"><code><div>sudo apt-get install $(apt-cache --names-only search ^gstreamer1.0-* | awk '{ print $1 }' | grep -v gstreamer1.0-hybris) -y
</div></code></pre>
<h2 id="enable-gstreamer-plugin">Enable GStreamer Plugin</h2>
<ul>
<li>
<p>Changed line at file <code><Framework>/Tools/sitl_gazebo/CMakeLists.txt</code></p>
<pre class="hljs"><code><div>option(BUILD_GSTREAMER_PLUGIN "enable gstreamer plugin" "ON")
</div></code></pre>
</li>
<li>
<p>Run</p>
<pre class="hljs"><code><div>posix_sitl_default gazebo_typhoon_h480
</div></code></pre>
</li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO-zaL2sxCpb59q2wYxRjKroeOnpPmub9kdyi8ddB0kvDaeyFvmRXUNShZItMwuMnFUCcdqaPWCEFZWupUVBXWlYemdQLArq5GVZmU9EQIk22Pa7x5rU8tPwKxdDZIw1snaCBoqy4u_LM/s1600/2018-11-05-20-54-59.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhO-zaL2sxCpb59q2wYxRjKroeOnpPmub9kdyi8ddB0kvDaeyFvmRXUNShZItMwuMnFUCcdqaPWCEFZWupUVBXWlYemdQLArq5GVZmU9EQIk22Pa7x5rU8tPwKxdDZIw1snaCBoqy4u_LM/s400/2018-11-05-20-54-59.png" width="400" height="303" data-original-width="652" data-original-height="494" /></a></div><img src="images/2018-11-05-20-54-59.png" alt=""></p>
<h2 id="view-stream">View stream</h2>
<ul>
<li>Run gstream</li>
</ul>
<pre class="hljs"><code><div>gst-launch-1.0 -v udpsrc port=5600 caps='application/x-rtp, media=(string)video, clock-rate=(int)90000, encoding-name=(string)H264' ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink fps-update-interval=1000 sync=false
</div></code></pre>
<h2 id="view-from-ground-control">View From Ground control</h2>
<ul>
<li>Config GSC</li>
</ul>
<p><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJgT7aCfbO4JADstoHgz-dQo-HDdHLJKxTbPR2x2dtZ-65_X4Lx9hVs2HL79g3-H13papSK-197vDbDc5LTjRRSAVY0Z_-Kg9UERN0piVlmyAMeUZwPosC6lOxniqfDi-emUN7a16pGc/s1600/2018-11-05-21-08-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbJgT7aCfbO4JADstoHgz-dQo-HDdHLJKxTbPR2x2dtZ-65_X4Lx9hVs2HL79g3-H13papSK-197vDbDc5LTjRRSAVY0Z_-Kg9UERN0piVlmyAMeUZwPosC6lOxniqfDi-emUN7a16pGc/s400/2018-11-05-21-08-13.png" width="400" height="197" data-original-width="1010" data-original-height="498" /></a></div></p>
<ul>
<li>Stream view (bottom left <img class="emoji" alt="smiley" src="data:image/png;base64,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" /></li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZebnym6HczqE78oZ3GmmCxq4oRwez2PQiAPzX04e4W0fVqAC3GOidvkzO_F3dLwRLjssed50JGTqkcFgimgsQYxcSNQg43CejZT9ZYtDVBxL7xEBxgE70pRj2TGmIhZgusJMoJ4VSFoI/s1600/2018-11-05-21-08-48.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZebnym6HczqE78oZ3GmmCxq4oRwez2PQiAPzX04e4W0fVqAC3GOidvkzO_F3dLwRLjssed50JGTqkcFgimgsQYxcSNQg43CejZT9ZYtDVBxL7xEBxgE70pRj2TGmIhZgusJMoJ4VSFoI/s400/2018-11-05-21-08-48.png" width="400" height="218" data-original-width="1011" data-original-height="552" /></a></div></p>
<h2 id="opt-flow">Opt flow</h2>
<pre class="hljs"><code><div>make posix_sitl_default gazebo_iris_opt_flow
</div></code></pre>
<pre class="hljs"><code><div>gz topic -l
/gazebo/default/iris_opt_flow/px4flow/link/opticalFlow
/gazebo/default/iris_opt_flow/px4flow/link/px4flow/cmd
/gazebo/default/iris_opt_flow/px4flow/link/px4flow/image
/gazebo/default/iris_opt_flow/px4flow/link/px4flow/imu
/gazebo/default/iris_opt_flow/px4flow/link/wrench
</div></code></pre>
<pre class="hljs"><code><div>gz topic -i /gazebo/default/iris_opt_flow/px4flow/link/px4flow/image
Type: gazebo.msgs.ImageStamped
Publishers:
192.168.2.200:45849
</div></code></pre>
<h3 id="read-image-from-gazebo">read image from gazebo</h3>
<ul>
<li>
<p><a href="http://answers.gazebosim.org/question/14619/how-to-convert-gazebos-constimagestamped-to-cvmat/">How to convert Gazebo's ConstImageStamped to cv::Mat?</a></p>
</li>
<li>
<p><a href="http://gazebosim.org/tutorials?tut=topics_subscribed">Topics subscription</a></p>
</li>
<li>
<p><a href="http://gazebosim.org/tutorials?tut=gazebojs_install&cat=gazebojs">nodejs</a></p>
</li>
</ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-21907999686490486212018-11-02T00:09:00.000-07:002018-11-02T00:09:25.691-07:00Hello DroneCode<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
<p>The Dronecode SDK is a MAVLink Library for the PX4 flight stack, with APIs for C++
The library provides a simple API for managing one or more vehicles, providing programmatic access to vehicle information and telemetry, and control over missions, movement and other operations.
<a href="https://sdk.dronecode.org/en/">SDK Main page</a></p>
<h2 id="install-sdk">Install SDK</h2>
<ul>
<li><a href="https://github.com/Dronecode/DronecodeSDK/releases">Release</a></li>
<li><a href="https://sdk.dronecode.org/en/contributing/build.html">Source</a></li>
</ul>
<p><strong>Note</strong>: First I Install from Release (deb) and try to compile the example <code>takeoff_amd_land</code>
- The code look for <code>action_result.h</code> file that wasn't exists</p>
<h3 id="install-sdk-from-source">Install SDK from source</h3>
<pre class="hljs"><code><div>git <span class="hljs-built_in">clone</span> https://github.com/Dronecode/DronecodeSDK.git
<span class="hljs-built_in">cd</span> DronecodeSDK
<span class="hljs-comment">#master branch contain code like the deb</span>
git checkout develop
git submodule update --init --recursive
make default
<span class="hljs-comment">#Install</span>
sudo make default install
sudo ldconfig <span class="hljs-comment"># update linker cache</span>
</div></code></pre>
<h2 id="takeoff-example">Takeoff example</h2>
<ul>
<li><a href="https://sdk.dronecode.org/en/cpp/">SDK C++</a></li>
</ul>
<h3 id="project-struct">Project struct</h3>
<pre class="hljs"><code><div>├── bin
├── build
├── CMakeLists.txt
├── docs
├── README.md
└── src
├── CMakeLists.txt
└── takeoff_and_land.cpp
</div></code></pre>
<ul>
<li><code>root</code> Cmake file</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">cmake_minimum_required</span>(VERSION <span class="hljs-number">2.8</span>.<span class="hljs-number">12</span>)
<span class="hljs-keyword">project</span>(xdrone)
<span class="hljs-keyword">set</span>(CMAKE_CXX_STANDARD <span class="hljs-number">11</span>)
<span class="hljs-keyword">include_directories</span>(/usr/local/<span class="hljs-keyword">include</span>/dronecode_sdk)
<span class="hljs-keyword">link_directories</span>(/usr/local/lib)
<span class="hljs-keyword">set</span>(EXECUTABLE_OUTPUT_PATH <span class="hljs-variable">${CMAKE_SOURCE_DIR}</span>/bin)
<span class="hljs-keyword">add_subdirectory</span>(src)
</div></code></pre>
<ul>
<li><code>src</code> cmake file</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">add_executable</span>(takeoff_and_land takeoff_and_land.cpp)
<span class="hljs-keyword">target_link_libraries</span>(takeoff_and_land
dronecode_sdk
dronecode_sdk_telemetry
dronecode_sdk_action
)
</div></code></pre>
<p>Paste code from <a href="https://sdk.dronecode.org/en/examples/takeoff_and_land.html">takeoff_and_land</a></p>
<ul>
<li>Run SITL <code>make posix_sitl_default gazebo_iris</code> from px4 Firmware folder</li>
<li>Run the code</li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHgBYiz0dDvA2yO9aSLAz_yLkix9KMMCztV-tfCrGJqWjkvHv3DF-QHhb0lOnFqVfdhWBvO1Z0z-0ywIepRALzaI2DLbAOL61EgJacUZtkSFz_I8ZKRdJHG7srQ6CGg7h3LJrUOV1CblY/s1600/takeoff.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHgBYiz0dDvA2yO9aSLAz_yLkix9KMMCztV-tfCrGJqWjkvHv3DF-QHhb0lOnFqVfdhWBvO1Z0z-0ywIepRALzaI2DLbAOL61EgJacUZtkSFz_I8ZKRdJHG7srQ6CGg7h3LJrUOV1CblY/s400/takeoff.gif" width="353" height="400" data-original-width="918" data-original-height="1040" /></a></div></p>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-13030209981781146192018-10-31T09:45:00.000-07:002018-10-31T09:45:32.257-07:00ROS Service client<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<ul>
<li>Terminal 1</li>
</ul>
<pre class="hljs"><code><div>roscore
</div></code></pre>
<ul>
<li>Terminal 2</li>
</ul>
<pre class="hljs"><code><div>rosrun turtlesim turtlesim_node
</div></code></pre>
<ul>
<li>Terminal 3</li>
</ul>
<pre class="hljs"><code><div>rosservice list
/clear
/kill
/reset
/rosout/get_loggers
/spawn
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
</div></code></pre>
<h2 id="spawn-service">spawn service</h2>
<p>Spawn another turtle with <code>spawn service</code></p>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibIpX9U98hmKkUc05_9yjvxZvofAk4coSFgB5Qq3Z030YK6N1wqchpv3Kj43Uu60kwGuPPGxj6CXVVsClLinfVeeXVMl-mWz69Wcj-yjlv6TV7ximB7qKZG9ktTzSdc90paWlvlgX4dek/s1600/2018-10-30-21-29-15.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibIpX9U98hmKkUc05_9yjvxZvofAk4coSFgB5Qq3Z030YK6N1wqchpv3Kj43Uu60kwGuPPGxj6CXVVsClLinfVeeXVMl-mWz69Wcj-yjlv6TV7ximB7qKZG9ktTzSdc90paWlvlgX4dek/s400/2018-10-30-21-29-15.png" width="400" height="370" data-original-width="499" data-original-height="461" /></a></div></p>
<ul>
<li>rosservice info <code><service name></code></li>
</ul>
<pre class="hljs"><code><div>rosservice info /spawn
Node: /turtlesim
URI: rosrpc://user-N56VM:43083
Type: turtlesim/Spawn
Args: x y theta name
</div></code></pre>
<ul>
<li>rossrv info <code><service type></code></li>
</ul>
<pre class="hljs"><code><div>float32 x
float32 y
float32 theta
string name
---
string name
</div></code></pre>
<h2 id="call-execute">call / execute</h2>
<pre class="hljs"><code><div><span class="hljs-comment">#left down corner: 0,0</span>
rosservice call /spawn <span class="hljs-string">"x: 3.0
y: 3.0
theta: 0.0
name: 't1'"</span>
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU5S7JvUuB6iBMN-E822wfdNbOWFUdpq69CTh0BoZtNzxW-bMY_X9ld_Z2sxfQebDwCIyACLVsqcs_yz3lKq4Semsx76UAn1PZHukOxOn47TZsQIsd1cb8eEILuoSrKYeFH2xFGSW07qM/s1600/2018-10-30-21-34-57.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgU5S7JvUuB6iBMN-E822wfdNbOWFUdpq69CTh0BoZtNzxW-bMY_X9ld_Z2sxfQebDwCIyACLVsqcs_yz3lKq4Semsx76UAn1PZHukOxOn47TZsQIsd1cb8eEILuoSrKYeFH2xFGSW07qM/s400/2018-10-30-21-34-57.png" width="400" height="389" data-original-width="434" data-original-height="422" /></a></div></p>
<h2 id="service-client">service client</h2>
<ul>
<li>
<p><code>rosservice info</code> result show the the service implement in /turtlesim package</p>
</li>
<li>
<p>most simple service client (without error handler)</p>
</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#!/usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">from</span> turtlesim.srv <span class="hljs-keyword">import</span> Spawn
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
service = rospy.ServiceProxy(<span class="hljs-string">'/spawn'</span>, Spawn)
service(x=<span class="hljs-number">3.0</span>, y=<span class="hljs-number">3.0</span>, theta=<span class="hljs-number">0.0</span>, name=<span class="hljs-string">"t1"</span>)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()
</div></code></pre>
<p>Service client send Request and server answer with response</p>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitib5oG2IaRqaxEgHPpqNRsjkVSPp2eYNyi-lAG2RSQC6G6EtzHyfthsqcZMU3VgrpLW5zQoFbRfAm3IovKYJ4yotPDjfWz2aNvk9nsRQ6auN18r-i1cISjOR5wRHkSWDiUo3V4vQ8qsQ/s1600/2018-10-31-18-16-34.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitib5oG2IaRqaxEgHPpqNRsjkVSPp2eYNyi-lAG2RSQC6G6EtzHyfthsqcZMU3VgrpLW5zQoFbRfAm3IovKYJ4yotPDjfWz2aNvk9nsRQ6auN18r-i1cISjOR5wRHkSWDiUo3V4vQ8qsQ/s400/2018-10-31-18-16-34.png" width="400" height="100" data-original-width="450" data-original-height="112" /></a></div></p>
<p>The service declare by service message that has tow parts request and response</p>
<pre class="hljs"><code><div>request
---
response
</div></code></pre>
<ul>
<li>For example Spawn.srv file under turtlesim.srv folder</li>
</ul>
<pre class="hljs"><code><div>float32 x
float32 y
float32 theta
string name
---
string
</div></code></pre>
<p>When compile the packaged catkin build and install class file that contains the class for example:</p>
<ul>
<li>Spawn</li>
<li>SpawnRequest</li>
<li>SpawnResponse</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#!/usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">from</span> turtlesim.srv <span class="hljs-keyword">import</span> Spawn, SpawnRequest
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
service = rospy.ServiceProxy(<span class="hljs-string">'/spawn'</span>, Spawn)
req = SpawnRequest(x=<span class="hljs-number">3.0</span>, y=<span class="hljs-number">3.0</span>, theta=<span class="hljs-number">0.0</span>, name=<span class="hljs-string">"t1"</span>)
res = service(req)
<span class="hljs-keyword">print</span> res.name
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main
</div></code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-86844074284087138372018-10-27T15:46:00.001-07:002018-10-27T15:47:48.313-07:00ROSPy node templates<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h3 id="spin-and-rate">Spin and Rate</h3>
<p><code>spin()</code> and <code>rate()</code> are resposible to handle communication events, e.g. arriving messages. If you are subscribing messages, services or actions you must call them to process the events.</p>
<h3 id="using-rospyrate">Using rospy.rate</h3>
<ul>
<li>rospy rate</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#! /usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
NODE_NAME = <span class="hljs-string">"reading_laser"</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">my_shutdown</span><span class="hljs-params">()</span>:</span>
rospy.loginfo(<span class="hljs-string">"Shutdown node"</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
rospy.init_node(NODE_NAME)
rospy.loginfo(<span class="hljs-string">"Init node: {}"</span>.format(NODE_NAME))
rospy.on_shutdown(my_shutdown)
rate = rospy.Rate(<span class="hljs-number">1</span>)
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> rospy.is_shutdown():
rate.sleep()
rospy.loginfo(datetime.now().strftime(<span class="hljs-string">"%b %d %Y %H:%M:%S"</span>))
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()
</div></code></pre>
<ul>
<li>Loop run every one second (rate 1 Hz)</li>
<li>Run Node (don't forget to <code>chmod</code>)</li>
</ul>
<pre class="hljs"><code><div>[INFO] [1540546445.840602]: Init node: reading_laser
[INFO] [1540546446.842748]: Oct 26 2018 12:34:06
[INFO] [1540546447.842572]: Oct 26 2018 12:34:07
[INFO] [1540546448.842655]: Oct 26 2018 12:34:08
</div></code></pre>
<h3 id="using-rospyspin">Using rospy.spin</h3>
<ul>
<li>main thread wait for shutdown (ctrl-c)</li>
<li>Other event are invoked</li>
<li></li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#! /usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
NODE_NAME = <span class="hljs-string">"reading_laser"</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">my_shutdown</span><span class="hljs-params">()</span>:</span>
rospy.loginfo(<span class="hljs-string">"Shutdown node"</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
rospy.init_node(NODE_NAME)
rospy.loginfo(<span class="hljs-string">"Init node: {}"</span>.format(NODE_NAME))
rospy.on_shutdown(my_shutdown)
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> rospy.is_shutdown():
rospy.spin()
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()
</div></code></pre>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-80535499714014213562018-10-27T09:57:00.002-07:002018-10-27T15:47:33.892-07:00GTest Hello<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h1 id="gtest">GTest</h1>
<p>Google test is a framework for writing C++ unit tests</p>
<h2 id="download-and-install">Download and install</h2>
<ul>
<li>apt (download source code)</li>
<li>run cmake</li>
<li>copy to /usr/lib</li>
</ul>
<pre class="hljs"><code><div>sudo apt install libgtest-dev
<span class="hljs-built_in">cd</span> /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make
<span class="hljs-comment"># copy or symlink libgtest.a and libgtest_main.a to your /usr/lib folder</span>
sudo cp *.a /usr/lib
</div></code></pre>
<h2 id="demo-project-structure">Demo Project structure</h2>
<pre class="hljs"><code><div>├── CMakeLists.txt
├── bin
├── build
├── src
│ ├── CMakeLists.txt
│ ├── hello.cpp
│ └── whattotest.cpp
└── tests
├── CMakeLists.txt
├── tests.cpp
└── tests_main.cpp
</div></code></pre>
<ul>
<li>code under tests (whattotest.cpp)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><math.h></span></span>
<span class="hljs-function"><span class="hljs-keyword">double</span> <span class="hljs-title">squareRoot</span><span class="hljs-params">(<span class="hljs-keyword">const</span> <span class="hljs-keyword">double</span> a)</span></span>{
<span class="hljs-keyword">double</span> b = <span class="hljs-built_in">sqrt</span>(a);
<span class="hljs-keyword">if</span> (b != b){
<span class="hljs-keyword">return</span> <span class="hljs-number">-1.0</span>;
}<span class="hljs-keyword">else</span> {
<span class="hljs-keyword">return</span> <span class="hljs-built_in">sqrt</span>(a);
}
}
</div></code></pre>
<ul>
<li>test main file (tests_main.cpp)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><gtest/gtest.h></span></span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">(<span class="hljs-keyword">int</span> argc, <span class="hljs-keyword">char</span> **argv)</span> </span>{
testing::InitGoogleTest(&argc, argv);
<span class="hljs-keyword">return</span> RUN_ALL_TESTS();
}
</div></code></pre>
<ul>
<li>Tests (tests.cpp)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">"../src/whattotest.cpp"</span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><gtest/gtest.h></span></span>
TEST(SquareRootTest, PositiveNos) {
ASSERT_EQ(<span class="hljs-number">6</span>, squareRoot(<span class="hljs-number">36.0</span>));
}
TEST(SquareRootTest, NegativeNos) {
ASSERT_EQ(<span class="hljs-number">-1.0</span>, squareRoot(<span class="hljs-number">-15.0</span>));
}
</div></code></pre>
<ul>
<li>Main CMakeLists.txt</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">cmake_minimum_required</span>(VERSION <span class="hljs-number">3.0</span>)
<span class="hljs-keyword">project</span>(scope)
<span class="hljs-comment">#set binary output</span>
<span class="hljs-keyword">set</span>(EXECUTABLE_OUTPUT_PATH <span class="hljs-variable">${CMAKE_SOURCE_DIR}</span>/bin)
<span class="hljs-keyword">message</span>(<span class="hljs-variable">${EXECUTABLE_OUTPUT_PATH}</span>)
<span class="hljs-comment">#set flags</span>
<span class="hljs-keyword">set</span>(CMAKE_CXX_STANDARD <span class="hljs-number">14</span>)
<span class="hljs-comment">#add source directory</span>
<span class="hljs-keyword">add_subdirectory</span>(src)
<span class="hljs-keyword">add_subdirectory</span>(tests)
</div></code></pre>
<ul>
<li>tests folder CMakeLists.txt</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment"># Locate GTest</span>
<span class="hljs-keyword">find_package</span>(GTest REQUIRED)
<span class="hljs-keyword">include_directories</span>(<span class="hljs-variable">${GTEST_INCLUDE_DIRS}</span>)
<span class="hljs-comment"># Link runTests with what we want to test and the GTest and pthread library</span>
<span class="hljs-keyword">add_executable</span>(runTests tests_main.cpp
tests.cpp)
<span class="hljs-keyword">target_link_libraries</span>(runTests <span class="hljs-variable">${GTEST_LIBRARIES}</span> pthread)
</div></code></pre>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://www.eriksmistad.no/getting-started-with-google-test-on-ubuntu/">Getting started with Google Test (GTest) on Ubuntu</a></li>
<li><a href="https://github.com/google/googletest/blob/master/googletest/docs/primer.md">Googletest Primer</a></li>
<li><a href="https://github.com/google/googletest/blob/master/googletest/docs/advanced.md">Advanced googletest Topics
</a></li>
<li><a href="https://www.ibm.com/developerworks/aix/library/au-googletestingframework.html">A quick introduction to the Google C++ Testing Framework</a></li>
</ul>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-60970563705677851872018-10-22T08:48:00.001-07:002018-11-02T00:00:52.541-07:00BASH Tips<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h2 id="use-arguments-from-previous-command">Gnome Terminal Theme</h2>
<pre>
https://github.com/Mayccoll/Gogh
</pre>
<h2 id="use-arguments-from-previous-command">Use arguments from previous command</h2>
<pre class="hljs"><code><div>!^ first argument
!$ last argument
!* all arguments
!:2 second argument
!:2-3 second to third arguments
!:2-$ second to last arguments
!:2* second to last arguments
!:2- second to next to last arguments
!:0 the command
!! repeat the previous line
</div></code></pre>
<h3 id="using-first-argument">Using first argument</h3>
<pre class="hljs"><code><div><span class="hljs-built_in">echo</span> a b c d
a b c d
<span class="hljs-built_in">echo</span> !:1
<span class="hljs-built_in">echo</span> a
a
</div></code></pre>
<h3 id="using-last-argument">Using last argument</h3>
<pre class="hljs"><code><div><span class="hljs-built_in">echo</span> a b c d
a b c d
<span class="hljs-built_in">echo</span> !$
<span class="hljs-built_in">echo</span> d
d
</div></code></pre>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-41364989580043426652018-10-21T13:02:00.002-07:002018-10-22T08:34:33.407-07:00VSCode cmake and debug<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h1 id="vscode-build-with-cmake">VSCode build with cmake</h1>
<ul>
<li>ctrl+shift+p -> Tasks: Configure Task</li>
</ul>
<p>vscode open <code>tasks.json</code></p>
<ul>
<li>Project fs structure</li>
</ul>
<pre class="hljs"><code><div>├── bin
├── build
├── doc
└── src
├── CMakeLists.txt
└── hello.cpp
└── CMakeLists.txt
</div></code></pre>
<ul>
<li>Add three task
<ul>
<li><strong>cmake</strong>: run cmake from build sub folder</li>
<li><strong>make</strong>: run make depend on cmake</li>
<li><strong>build</strong>: bind the above</li>
</ul>
</li>
</ul>
<pre class="hljs"><code><div>{
<span class="hljs-attr">"version"</span>: <span class="hljs-string">"2.0.0"</span>,
<span class="hljs-attr">"tasks"</span>: [
{
<span class="hljs-attr">"label"</span>: <span class="hljs-string">"cmake"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"shell"</span>,
<span class="hljs-attr">"options"</span>: {
<span class="hljs-attr">"cwd"</span>: <span class="hljs-string">"${workspaceRoot}/build"</span>
},
<span class="hljs-attr">"command"</span>: <span class="hljs-string">"cmake"</span>,
<span class="hljs-attr">"args"</span>: [
<span class="hljs-string">".."</span>
]
},
{
<span class="hljs-attr">"label"</span>: <span class="hljs-string">"make"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"shell"</span>,
<span class="hljs-attr">"options"</span>: {
<span class="hljs-attr">"cwd"</span>: <span class="hljs-string">"${workspaceRoot}/build"</span>
},
<span class="hljs-attr">"command"</span>: <span class="hljs-string">"make"</span>,
<span class="hljs-attr">"dependsOn"</span>: <span class="hljs-string">"cmake"</span>
},
{
<span class="hljs-attr">"label"</span>: <span class="hljs-string">"build"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"shell"</span>,
<span class="hljs-attr">"dependsOn"</span>: <span class="hljs-string">"make"</span>,
<span class="hljs-attr">"command"</span>: <span class="hljs-string">"echo"</span>,
<span class="hljs-attr">"group"</span>: {
<span class="hljs-attr">"kind"</span>: <span class="hljs-string">"build"</span>,
<span class="hljs-attr">"isDefault"</span>: <span class="hljs-literal">true</span>
}
}
]
}
</div></code></pre>
<ul>
<li>Note: task <code>build</code> command key need to be fill with some value <code>echo</code></li>
</ul>
<h2 id="cmake-files">cmake files</h2>
<ul>
<li>root cmake
<ul>
<li>set bin folder as binary output</li>
<li>set c++ version: <code>set(CMAKE_CXX_STANDARD 11)</code></li>
</ul>
</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">cmake_minimum_required</span>(VERSION <span class="hljs-number">3.0</span>)
<span class="hljs-keyword">project</span>(tutorials)
<span class="hljs-comment">#set binary output</span>
<span class="hljs-keyword">set</span>(EXECUTABLE_OUTPUT_PATH <span class="hljs-variable">${CMAKE_SOURCE_DIR}</span>/bin)
<span class="hljs-keyword">message</span>(<span class="hljs-variable">${EXECUTABLE_OUTPUT_PATH}</span>)
<span class="hljs-comment">#set flags</span>
<span class="hljs-keyword">set</span>(CMAKE_CXX_STANDARD <span class="hljs-number">11</span>)
<span class="hljs-comment">#add source directory</span>
<span class="hljs-keyword">add_subdirectory</span>(src)
</div></code></pre>
<ul>
<li>src</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">add_executable</span>(hello hello.cpp)
</div></code></pre>
<h2 id="debug-task">Debug Task</h2>
<ul>
<li>Control cmake settings from command line</li>
<li>Add args to task</li>
<li>Add <code>option</code> variable and if statement to cmake</li>
</ul>
<h3 id="main-cmakeliststxt">Main CMakeLists.txt</h3>
<ul>
<li>Add boolean variable control</li>
</ul>
<pre class="hljs"><code><div>option (MODE_DEBUG "Set debug mode" OFF)
if (MODE_DEBUG)
message("DEBUG MODE")
set (CMAKE_BUILD_TYPE Debug)
endif()
</div></code></pre>
<ul>
<li>Add new task to VSC with args <code>-DMODE_DEBUG=TRUE</code></li>
</ul>
<pre class="hljs"><code><div>{
<span class="hljs-attr">"label"</span>: <span class="hljs-string">"cmake_with_debug"</span>,
<span class="hljs-attr">"type"</span>: <span class="hljs-string">"shell"</span>,
<span class="hljs-attr">"options"</span>: {
<span class="hljs-attr">"cwd"</span>: <span class="hljs-string">"${workspaceRoot}/build"</span>
},
<span class="hljs-attr">"command"</span>: <span class="hljs-string">"cmake"</span>,
<span class="hljs-attr">"args"</span>: [
<span class="hljs-string">".."</span>,
<span class="hljs-string">"-DMODE_DEBUG=TRUE"</span>
]
}
</div></code></pre>
<ul>
<li>Add VSC keybinding</li>
</ul>
<pre class="hljs"><code><div>{
<span class="hljs-attr">"key"</span>: <span class="hljs-string">"ctrl+shift+d"</span>,
<span class="hljs-attr">"command"</span>: <span class="hljs-string">"workbench.action.tasks.runTask"</span>,
<span class="hljs-attr">"args"</span>: <span class="hljs-string">"cmake_with_debug"</span>
}
</div></code></pre>
<h2 id="debug">Debug</h2>
<h3 id="launchjson">launch.json</h3>
<ul>
<li>Changed to debug mode</li>
<li>From combo box -> <code>Add configuration</code>
<ul>
<li>open <code>launch.json</code></li>
</ul>
</li>
<li>Set <code>program</code> to debug</li>
</ul>
<pre class="hljs"><code><div>"program": "${workspaceFolder}/bin/hello",
</div></code></pre>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-87039851704329044782018-10-20T13:44:00.000-07:002018-10-24T13:08:53.400-07:00Cross-compile straceCompile strace statically build use on RPi<br />
<br />
- Download strace source code <a href="https://sourceforge.net/projects/strace/files/strace/4.8/" target="_blank">strace 4.8</a><br />
- Download/Pull RPi toolchain: https://github.com/raspberrypi/tools<br />
- Export CC variable, point to compiler RPi toolchain gcc<br />
<br />
<br />
<br />
<div style="source">
export CC=<toolchain root="">/tools/arm-bcm2708/arm-rpi-4.9.3-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
</toolchain></div>
<h2>run</h2>
<div style="source">
export LDFLAGS=-static && ./configure --host=arm-linux
</toolchain></div>
<div>make</div>
<h2>Check</h2>
<div>file strace</div>
<div>
strace: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 2.6.32, not stripped
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-28399221297723572792018-10-12T06:36:00.003-07:002018-10-12T06:37:20.637-07:00ROS Follow the line<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h2>Gazebo image topics</h2>
<ul>
<li>Terminal1 (gazebo turtlebot)</li>
</ul>
<pre class="hljs"><code><div>roslaunch turtlebot_gazebo turtlebot_world.launch
</div></code></pre>
<ul>
<li>Terminal2</li>
</ul>
<pre class="hljs"><code><div>rostopic list
</div></code></pre>
<ul>
<li>depth camera</li>
<li>rgb camera
<ul>
<li>raw: raw image</li>
<li>compress: compress image</li>
<li>theora: compress video</li>
</ul>
</li>
</ul>
<p>ROS sent image useing <code>sensor_msgs/Image</code></p>
<h2 id="follower-node">Follower node</h2>
<ul>
<li>subscribe to /camera/rgb/image_raw topic receive Image msg</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#!/usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">from</span> sensor_msgs.msg <span class="hljs-keyword">import</span> Image
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">image_callback</span><span class="hljs-params">(msg)</span>:</span>
<span class="hljs-keyword">pass</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
rospy.init_node(<span class="hljs-string">"follower"</span>)
rospy.loginfo(<span class="hljs-string">"start node"</span>)
sub = rospy.Subscriber(<span class="hljs-string">"/camera/rgb/image_raw"</span>, Image, image_callback)
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> rospy.is_shutdown():
rospy.spin()
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()
</div></code></pre>
<ul>
<li>Set node permission (<code>chmod +x</code>)</li>
<li>Run in separated Terminal</li>
</ul>
<pre class="hljs"><code><div>rosrun <package_name> follower.py
</div></code></pre>
<ul>
<li>Check that the node is running</li>
<li>Get node info with <code>rosnode info /follower</code></li>
<li>Check message receive interval</li>
</ul>
<pre class="hljs"><code><div>rostopic hz /camera/rgb/image_raw
subscribed to [/camera/rgb/image_raw]
WARNING: may be using simulated time
average rate: 30.208
min: 0.010s max: 0.060s std dev: 0.01642s window: 30
average rate: 28.061
min: 0.010s max: 0.060s std dev: 0.01638s window: 56
</div></code></pre>
<h2 id="setup-follow-the-line">Setup <code>follow the line</code></h2>
<h3 id="launch-file-and-projects-structure">launch file and projects structure</h3>
<ul>
<li>launch file
<ul>
<li>worlds</li>
</ul>
</li>
<li>gazebo resource
<ul>
<li>materials</li>
</ul>
</li>
</ul>
<pre class="hljs"><code><div>├── launch
│ └── follow.launch
├── materials
│ ├── course.material
│ └── course.png
├── models
├── scripts
│ └── follower.py
├── src
└── worlds
└── course.world
</div></code></pre>
<pre class="hljs"><code><div><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span><span class="hljs-meta">?></span></span>
<span class="hljs-tag"><<span class="hljs-name">launch</span>></span>
<span class="hljs-tag"><<span class="hljs-name">env</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"GAZEBO_RESOURCE_PATH"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"$(find follow_bot)/materials:$(optenv GAZEBO_RESOURCE_PATH)"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">include</span> <span class="hljs-attr">file</span>=<span class="hljs-string">"$(find gazebo_ros)/launch/empty_world.launch"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"world_name"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"$(find follow_bot)/worlds/course.world"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-tag"><<span class="hljs-name">include</span> <span class="hljs-attr">file</span>=<span class="hljs-string">"$(find turtlebot_gazebo)/launch/includes/kobuki.launch.xml"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"base"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"kobuki"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"stacks"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"hexagons"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">arg</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"3d_sensor"</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"kinect"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">include</span>></span>
<span class="hljs-tag"></<span class="hljs-name">launch</span>></span>
</div></code></pre>
<p>Note: launch file set <code>GAZEBO_RESOURCE_PATH</code> environment variable using <code>env</code> tag</p>
<h3 id="view-image">View image</h3>
<pre class="hljs"><code><div><span class="hljs-comment">#!/usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">from</span> sensor_msgs.msg <span class="hljs-keyword">import</span> Image
<span class="hljs-keyword">import</span> cv2
<span class="hljs-keyword">import</span> cv_bridge
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Follower</span><span class="hljs-params">(object)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span>
self._bridge = cv_bridge.CvBridge()
sub = rospy.Subscriber(<span class="hljs-string">"/camera/rgb/image_raw"</span>, Image, self.image_callback)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">image_callback</span><span class="hljs-params">(self, msg)</span>:</span>
image = self._bridge.imgmsg_to_cv2(msg,desired_encoding=<span class="hljs-string">'bgr8'</span>)
cv2.imshow(<span class="hljs-string">"window"</span>, image)
cv2.waitKey(<span class="hljs-number">3</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_shutdown</span><span class="hljs-params">()</span>:</span>
rospy.loginfo(<span class="hljs-string">"shutdown"</span>)
cv2.destroyAllWindows()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
rospy.init_node(<span class="hljs-string">"follower"</span>)
rospy.loginfo(<span class="hljs-string">"start node"</span>)
rospy.on_shutdown(on_shutdown)
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> rospy.is_shutdown():
follower = Follower()
rospy.spin()
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
main()
</div></code></pre>
<p>Note: When we use the <code>cv2.namedWindow</code> Method the Window was freeze
check the <a href="https://stackoverflow.com/questions/51248709/frozen-black-image-and-trackbar-while-using-opencv-and-ros">line</a> solution</p>
<p><img src="https://github.com/amire2000/catkin_ws/raw/master/src/follow_bot/images/2018-10-12-14-07-26.png" alt=""></p>
<h2 id="detecting-the-line">Detecting the line</h2>
<ul>
<li>Find the yellow line</li>
</ul>
<pre class="hljs"><code><div>lower_yellow = numpy.array([ 50, 50, 170])
upper_yellow = numpy.array([255, 255, 190])
mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
</div></code></pre>
<ul>
<li>left: orignal</li>
<li>center: mask imaged (binary)</li>
<li>right: masked image (extrat only the line from orignal image)</li>
</ul>
<p><img src="https://github.com/amire2000/catkin_ws/raw/master/src/follow_bot/images/2018-10-12-14-44-12.png" alt=""></p>
<h3 id="find-line-center">Find line center</h3>
<ul>
<li>Mask image and take only relevant part (closer path front to the robot)</li>
</ul>
<p><img src="https://github.com/amire2000/catkin_ws/raw/master/src/follow_bot/images/2018-10-12-16-16-10.png" alt=""></p>
<ul>
<li>Find line center with cv2 moments method</li>
<li>For debug draw circle on line centroid</li>
</ul>
<pre class="hljs"><code><div>M = cv2.moments(mask)
<span class="hljs-keyword">if</span> M[<span class="hljs-string">'m00'</span>] > <span class="hljs-number">0</span>:
cx = int(M[<span class="hljs-string">'m10'</span>]/M[<span class="hljs-string">'m00'</span>])
cy = int(M[<span class="hljs-string">'m01'</span>]/M[<span class="hljs-string">'m00'</span>])
cv2.circle(image, (cx, cy), <span class="hljs-number">20</span>, (<span class="hljs-number">0</span>,<span class="hljs-number">0</span>,<span class="hljs-number">255</span>), <span class="hljs-number">-1</span>)
</div></code></pre>
<p><img src="https://github.com/amire2000/catkin_ws/raw/master/src/follow_bot/images/2018-10-12-14-48-19.png" alt=""></p>
<pre class="hljs"><code><div>- Public `Twist` message , calc z angular value
```python
#delta/ error between line center to image center
delta = cx - w/2
twist = Twist()
twist.linear.x = 0.2
twist.angular.z = -float(delta) / 100
self._cmd_vel_pub.publish(twist)
</div></code></pre>
<h3 id="final-demo">Final demo</h3>
<p><img src="https://github.com/amire2000/catkin_ws/raw/master/src/follow_bot/images/follow20181012_145757.gif" alt=""></p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="http://shop.oreilly.com/product/0636920024736.do">Programing robots with ROS book</a></li>
<li><a href="https://www.learnopencv.com/tag/cv2-moments/">OpenCV moments</a></li>
<li><a href="https://github.com/amire2000/catkin_ws/tree/master/src/follow_bot">My source code</a></li>
</ul>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-16282019509433289302018-10-09T14:00:00.001-07:002018-10-09T23:08:34.651-07:00ROS OpenCV hello<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<p>ros kinetic work with openCV 3.1</p>
<pre class="hljs"><code><div>sudo apt install ros-kinetic-opencv3
</div></code></pre>
<ul>
<li>after install check with python</li>
</ul>
<pre class="hljs"><code><div>> import cv2
> cv2.__version__
'3.3.1-dev'
</div></code></pre>
<ul>
<li>Install helper utils and packages</li>
</ul>
<pre class="hljs"><code><div>sudo apt install ros-kinetic-usb-cam
sudo apt install ros-kinetic-image-view
</div></code></pre>
<h2 id="cvbridge">CvBridge</h2>
<p>Convert ROS image messages (sensor_msgs/Images) and OpenCv images (cv::Mat)</p>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7APF1jdEHvOEKxDyJ-ln66J0dkKf0oT_t_eBlvDJiVx4dl2E_S7UncSRvln79NVpxOvy_Fvc2z9gaPWBgl5T7d797kfNWOAZrrElosFPaWGNBeNcrYKT5gaYEB8u6jdKjDaza6SQjpwo/s1600/2018-10-10-08-31-24.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7APF1jdEHvOEKxDyJ-ln66J0dkKf0oT_t_eBlvDJiVx4dl2E_S7UncSRvln79NVpxOvy_Fvc2z9gaPWBgl5T7d797kfNWOAZrrElosFPaWGNBeNcrYKT5gaYEB8u6jdKjDaza6SQjpwo/s320/2018-10-10-08-31-24.png" width="320" height="286" data-original-width="433" data-original-height="387" /></a></div></p>
<h2 id="demo">Demo</h2>
<ul>
<li>Use as <code>Gazebo camera plugin</code> post as Image source</li>
<li>Create package named <code>cv_demo</code> run the source code as rosnode <code>cvnode.py</code> package dependencies: sensor_msgs, opencv2, cv_bridge, rospy</li>
<li>The node create OpenCv image window</li>
<li>Use <code>rqt</code> to view publish image <code>image_topic</code></li>
</ul>
<h3 id="demo-setup">Demo setup</h3>
<ul>
<li>Terminal 1 (gazebo as image source)</li>
</ul>
<pre class="hljs"><code><div>roslaunch gazebo_ros empty_world.launch
</div></code></pre>
<ul>
<li>Terminal 2 (spawn camera)</li>
</ul>
<pre class="hljs"><code><div>rosrun gazebo_ros spawn_model -file camera.urdf -urdf -model bot
</div></code></pre>
<ul>
<li>Termianl 3 (run our node)</li>
</ul>
<pre class="hljs"><code><div>rosrun cv_demo cvnode.py
</div></code></pre>
<ul>
<li>Termianl 4 (rqt)</li>
</ul>
<pre class="hljs"><code><div>rqt
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaqh-ZFcFYpWvswL9nNdkGqH035_XdvAlM2zKrKt5hjWCB8uU5TiPrJmwO3V_SQZpzHDNjTZ-c6J5thZisaQ1iKC3OmGlhIW0cJEkabTK5LvGLOU2S0abI9YI00UopdaEWcB3mLB5tb_M/s1600/cv_bridge.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaqh-ZFcFYpWvswL9nNdkGqH035_XdvAlM2zKrKt5hjWCB8uU5TiPrJmwO3V_SQZpzHDNjTZ-c6J5thZisaQ1iKC3OmGlhIW0cJEkabTK5LvGLOU2S0abI9YI00UopdaEWcB3mLB5tb_M/s320/cv_bridge.gif" width="320" height="170" data-original-width="1600" data-original-height="848" /></a></div></p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="http://wiki.ros.org/cv_bridge/Tutorials/ConvertingBetweenROSImagesAndOpenCVImagesPython">Converting between ROS images and OpenCV images</a></li>
</ul>
<h2 id="source-code">Source code</h2>
<pre class="hljs"><code><div><span class="hljs-comment">#!/usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">import</span> cv2
<span class="hljs-keyword">from</span> cv_bridge <span class="hljs-keyword">import</span> CvBridge, CvBridgeError
<span class="hljs-keyword">import</span> numpy <span class="hljs-keyword">as</span> np
<span class="hljs-keyword">from</span> sensor_msgs.msg <span class="hljs-keyword">import</span> Image, CameraInfo
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CvBridgeDemo</span><span class="hljs-params">(object)</span>:</span>
NODE_NAME = <span class="hljs-string">"cv_demo"</span>
WIN_NAME = <span class="hljs-string">"cv_demo_win"</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span>
self._bridge = CvBridge()
self.image_sub = rospy.Subscriber(<span class="hljs-string">"/bot/camera/image_raw"</span>, Image, self.image_callback)
self.image_pub = rospy.Publisher(<span class="hljs-string">"image_topic"</span>, Image)
rospy.loginfo(<span class="hljs-string">"watting for image"</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">image_callback</span><span class="hljs-params">(self, ros_image)</span>:</span>
<span class="hljs-comment"># Use cv_bridge() to convert the ROS image to OpenCV format</span>
bridge = self._bridge
<span class="hljs-keyword">try</span>:
frame = bridge.imgmsg_to_cv2(ros_image, <span class="hljs-string">"bgr8"</span>)
<span class="hljs-keyword">except</span> CvBridgeError, e:
rospy.logerr(<span class="hljs-string">"fail convert ros image to cv: {}"</span>.format(e))
<span class="hljs-comment"># Convert the image to a Numpy array for cv2 functions</span>
frame = np.array(frame, dtype=np.uint8)
<span class="hljs-comment"># Process the frame using the process_image() function</span>
display_image = self.process_image(frame)
<span class="hljs-comment"># Display the image.</span>
cv2.imshow(CvBridgeDemo.WIN_NAME, display_image)
<span class="hljs-comment"># Process any keyboard commands</span>
cv2.waitKey(<span class="hljs-number">3</span>)
<span class="hljs-keyword">try</span>:
self.image_pub.publish(self._bridge.cv2_to_imgmsg(display_image, <span class="hljs-string">"mono8"</span>))
<span class="hljs-keyword">except</span> CvBridgeError <span class="hljs-keyword">as</span> e:
rospy.logerr(<span class="hljs-string">"fail convert cv image to rosmsg: {}"</span>.format(e))
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">process_image</span><span class="hljs-params">(self, frame)</span>:</span>
img = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,<span class="hljs-string">'OpenCV'</span>,(<span class="hljs-number">10</span>,<span class="hljs-number">500</span>), font, <span class="hljs-number">4</span>,(<span class="hljs-number">255</span>,<span class="hljs-number">255</span>,<span class="hljs-number">255</span>),<span class="hljs-number">2</span>,cv2.LINE_AA)
<span class="hljs-keyword">return</span> img
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">on_shutdown</span><span class="hljs-params">()</span>:</span>
<span class="hljs-keyword">print</span> <span class="hljs-string">"Shutting down cvnode."</span>
cv2.destroyAllWindows()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
rospy.init_node(CvBridgeDemo.NODE_NAME)
rospy.on_shutdown(on_shutdown)
<span class="hljs-keyword">while</span> <span class="hljs-keyword">not</span> rospy.is_shutdown():
CvBridgeDemo()
rospy.loginfo(<span class="hljs-string">"wait for shutdown"</span>)
<span class="hljs-comment">#The spin() code simply sleeps until the is_shutdown() flag is True. </span>
<span class="hljs-comment"># It is mainly used to prevent your Python Main thread from exiting.</span>
rospy.spin()
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
main()
</div></code></pre>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-5277921720510645472018-10-07T13:31:00.000-07:002018-10-07T22:32:56.279-07:00Gazebo camera plugin<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<p><a href="http://gazebosim.org/tutorials?tut=ros_gzplugins">resource</a></p>
<p>Plugins can be added to any of the main elements of a URDF - a <code><robot></code>, <code><link></code>, or <code><joint></code> depending on what the scope and purpose of the plugin is. when add <code><plugin></code> to urdf we wrap it with <code><gazebo></code> element</p>
<h3 id="adding-plugin-to-link-element">Adding plugin to link element</h3>
<pre class="hljs"><code><div><span class="hljs-tag"><<span class="hljs-name">gazebo</span> <span class="hljs-attr">reference</span>=<span class="hljs-string">"<link_name>"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">plugin</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"camera_controller"</span> <span class="hljs-attr">filename</span>=<span class="hljs-string">"libgazebo_ros_camera.so"</span>></span>
... plugin parameters ...
<span class="hljs-tag"></<span class="hljs-name">plugin</span>></span>
<span class="hljs-tag"></<span class="hljs-name">gazebo</span>></span>
</div></code></pre>
<h3 id="gazebo-camera">Gazebo Camera</h3>
<pre class="hljs"><code><div><span class="hljs-tag"><<span class="hljs-name">gazebo</span> <span class="hljs-attr">reference</span>=<span class="hljs-string">"camera_link"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">sensor</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"camera"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"camera"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">update_rate</span>></span>30.0<span class="hljs-tag"></<span class="hljs-name">update_rate</span>></span>
<span class="hljs-tag"><<span class="hljs-name">camera</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"head"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">horizontal_fov</span>></span>1.3962634<span class="hljs-tag"></<span class="hljs-name">horizontal_fov</span>></span>
<span class="hljs-tag"><<span class="hljs-name">image</span>></span>
<span class="hljs-tag"><<span class="hljs-name">width</span>></span>800<span class="hljs-tag"></<span class="hljs-name">width</span>></span>
<span class="hljs-tag"><<span class="hljs-name">height</span>></span>800<span class="hljs-tag"></<span class="hljs-name">height</span>></span>
<span class="hljs-tag"><<span class="hljs-name">format</span>></span>R8G8B8<span class="hljs-tag"></<span class="hljs-name">format</span>></span>
<span class="hljs-tag"></<span class="hljs-name">image</span>></span>
<span class="hljs-tag"><<span class="hljs-name">clip</span>></span>
<span class="hljs-tag"><<span class="hljs-name">near</span>></span>0.02<span class="hljs-tag"></<span class="hljs-name">near</span>></span>
<span class="hljs-tag"><<span class="hljs-name">far</span>></span>300<span class="hljs-tag"></<span class="hljs-name">far</span>></span>
<span class="hljs-tag"></<span class="hljs-name">clip</span>></span>
<span class="hljs-tag"><<span class="hljs-name">noise</span>></span>
<span class="hljs-tag"><<span class="hljs-name">type</span>></span>gaussian<span class="hljs-tag"></<span class="hljs-name">type</span>></span>
<span class="hljs-tag"><<span class="hljs-name">mean</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">mean</span>></span>
<span class="hljs-tag"><<span class="hljs-name">stddev</span>></span>0.007<span class="hljs-tag"></<span class="hljs-name">stddev</span>></span>
<span class="hljs-tag"></<span class="hljs-name">noise</span>></span>
<span class="hljs-tag"></<span class="hljs-name">camera</span>></span>
<span class="hljs-tag"><<span class="hljs-name">plugin</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"camera_controller"</span> <span class="hljs-attr">filename</span>=<span class="hljs-string">"libgazebo_ros_camera.so"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">alwaysOn</span>></span>true<span class="hljs-tag"></<span class="hljs-name">alwaysOn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">updateRate</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">updateRate</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cameraName</span>></span>bot/camera<span class="hljs-tag"></<span class="hljs-name">cameraName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">imageTopicName</span>></span>image_raw<span class="hljs-tag"></<span class="hljs-name">imageTopicName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cameraInfoTopicName</span>></span>camera_info<span class="hljs-tag"></<span class="hljs-name">cameraInfoTopicName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">frameName</span>></span>camera_link<span class="hljs-tag"></<span class="hljs-name">frameName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">hackBaseline</span>></span>0.07<span class="hljs-tag"></<span class="hljs-name">hackBaseline</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionK1</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionK1</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionK2</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionK2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionK3</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionK3</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionT1</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionT1</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionT2</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionT2</span>></span>
<span class="hljs-tag"></<span class="hljs-name">plugin</span>></span>
<span class="hljs-tag"></<span class="hljs-name">sensor</span>></span>
<span class="hljs-tag"></<span class="hljs-name">gazebo</span>></span>
<span class="hljs-tag"></<span class="hljs-name">robot</span>></span>
</div></code></pre>
<h3 id="name-and-topic">Name and Topic</h3>
<pre class="hljs"><code><div><span class="hljs-tag"><<span class="hljs-name">sensor</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"camera"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"camera"</span>></span>
</div></code></pre>
<ul>
<li>sensor name must be unique and used by <code>cameraName</code></li>
</ul>
<pre class="hljs"><code><div><span class="hljs-tag"><<span class="hljs-name">cameraName</span>></span>bot/camera<span class="hljs-tag"></<span class="hljs-name">cameraName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">imageTopicName</span>></span>image_raw<span class="hljs-tag"></<span class="hljs-name">imageTopicName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cameraInfoTopicName</span>></span>camera_info<span class="hljs-tag"></<span class="hljs-name">cameraInfoTopicName</span>></span>
</div></code></pre>
<h4 id="rostopic-list">rostopic list</h4>
<pre class="hljs"><code><div> rostopic list
/bot/camera/camera_info
/bot/camera/image_raw
/bot/camera/image_raw/compressed
/bot/camera/image_raw/compressed/parameter_descriptions
/bot/camera/image_raw/compressed/parameter_updates
/bot/camera/image_raw/compressedDepth
/bot/camera/image_raw/compressedDepth/parameter_descriptions
/bot/camera/image_raw/compressedDepth/parameter_updates
/bot/camera/image_raw/theora
/bot/camera/image_raw/theora/parameter_descriptions
/bot/camera/image_raw/theora/parameter_updates
/bot/camera/parameter_descriptions
/bot/camera/parameter_updates
...
</div></code></pre>
<h3 id="tf">tf</h3>
<p>The coordinate frame the image is published under in the tf tree.</p>
<pre class="hljs"><code><div> <span class="hljs-tag"><<span class="hljs-name">frameName</span>></span>camera_link<span class="hljs-tag"></<span class="hljs-name">frameName</span>></span>
</div></code></pre>
<h2 id="test">Test</h2>
<ul>
<li>Terminal 1(launch gazebo)</li>
</ul>
<pre class="hljs"><code><div>roslaunch gazebo_ros empty_world.launch
</div></code></pre>
<ul>
<li>Terminal 2(spawn)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#from urdf path</span>
rosrun gazebo_ros spawn_model -file camera.urdf -urdf -model bot
</div></code></pre>
<ul>
<li>Terminal 3(rqt)</li>
</ul>
<pre class="hljs"><code><div>rqt
<span class="hljs-comment"># Plugins -> Visualization-> image viewer</span>
<span class="hljs-comment"># From combo /bot/camera/image_raw</span>
</div></code></pre>
<ul>
<li>From gazebo add model in the front of camera</li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAQMC8Ms8GBLAQV42sifpXKJEaQDKutb5Ak0Y9qJ-W527jCYJy9vNdT90dJJtEhIV0TGp4Vu4FKiD6__7LWbHttwhJjWWRJ_grapowcPTYN_yK5REDmYZSBZEaC64BloJOu6PsPoobhzk/s1600/2018-10-08-08-26-17.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhAQMC8Ms8GBLAQV42sifpXKJEaQDKutb5Ak0Y9qJ-W527jCYJy9vNdT90dJJtEhIV0TGp4Vu4FKiD6__7LWbHttwhJjWWRJ_grapowcPTYN_yK5REDmYZSBZEaC64BloJOu6PsPoobhzk/s320/2018-10-08-08-26-17.png" width="320" height="231" data-original-width="637" data-original-height="460" /></a></div></p>
<ul>
<li>Check view in rqt
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkrIde7cYs0pfPabIhZ3tmyNM0hWVAftV1QlJAwRMlM8kghBR2H0uZGutPw32ftEJJpOe8q6-0Kb4lG-qaZi4NegmoalgJOcTj8YnbFMl81GUSqUd67d5uLQ9VzDvRp0Vfbc8B3uU3DHY/s1600/2018-10-08-08-26-58.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkrIde7cYs0pfPabIhZ3tmyNM0hWVAftV1QlJAwRMlM8kghBR2H0uZGutPw32ftEJJpOe8q6-0Kb4lG-qaZi4NegmoalgJOcTj8YnbFMl81GUSqUd67d5uLQ9VzDvRp0Vfbc8B3uU3DHY/s320/2018-10-08-08-26-58.png" width="320" height="251" data-original-width="656" data-original-height="515" /></a></div></li>
</ul>
<h1 id="full-urdf-code">Full urdf code</h1>
<pre class="hljs"><code><div><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span><span class="hljs-meta">?></span></span>
<span class="hljs-tag"><<span class="hljs-name">robot</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"bot"</span>></span>
<span class="hljs-comment"><!-- Camera --></span>
<span class="hljs-tag"><<span class="hljs-name">link</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"camera_link"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">collision</span>></span>
<span class="hljs-tag"><<span class="hljs-name">origin</span> <span class="hljs-attr">xyz</span>=<span class="hljs-string">"0 0 0"</span> <span class="hljs-attr">rpy</span>=<span class="hljs-string">"0 0 0"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"><<span class="hljs-name">box</span> <span class="hljs-attr">size</span>=<span class="hljs-string">"0.05 0.05 0.05"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"></<span class="hljs-name">collision</span>></span>
<span class="hljs-tag"><<span class="hljs-name">visual</span>></span>
<span class="hljs-tag"><<span class="hljs-name">origin</span> <span class="hljs-attr">xyz</span>=<span class="hljs-string">"0 0 0"</span> <span class="hljs-attr">rpy</span>=<span class="hljs-string">"0 0 0"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"><<span class="hljs-name">box</span> <span class="hljs-attr">size</span>=<span class="hljs-string">"0.05 0.05 0.05"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"><<span class="hljs-name">material</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"red"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">visual</span>></span>
<span class="hljs-tag"><<span class="hljs-name">inertial</span>></span>
<span class="hljs-tag"><<span class="hljs-name">mass</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"1e-5"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">origin</span> <span class="hljs-attr">xyz</span>=<span class="hljs-string">"0 0 0"</span> <span class="hljs-attr">rpy</span>=<span class="hljs-string">"0 0 0"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">inertia</span> <span class="hljs-attr">ixx</span>=<span class="hljs-string">"1e-6"</span> <span class="hljs-attr">ixy</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">ixz</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">iyy</span>=<span class="hljs-string">"1e-6"</span> <span class="hljs-attr">iyz</span>=<span class="hljs-string">"0"</span> <span class="hljs-attr">izz</span>=<span class="hljs-string">"1e-6"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">inertial</span>></span>
<span class="hljs-tag"></<span class="hljs-name">link</span>></span>
<span class="hljs-tag"><<span class="hljs-name">gazebo</span> <span class="hljs-attr">reference</span>=<span class="hljs-string">"camera_link"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">sensor</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"camera"</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"camera"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">update_rate</span>></span>30.0<span class="hljs-tag"></<span class="hljs-name">update_rate</span>></span>
<span class="hljs-tag"><<span class="hljs-name">camera</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"head"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">horizontal_fov</span>></span>1.3962634<span class="hljs-tag"></<span class="hljs-name">horizontal_fov</span>></span>
<span class="hljs-tag"><<span class="hljs-name">image</span>></span>
<span class="hljs-tag"><<span class="hljs-name">width</span>></span>800<span class="hljs-tag"></<span class="hljs-name">width</span>></span>
<span class="hljs-tag"><<span class="hljs-name">height</span>></span>800<span class="hljs-tag"></<span class="hljs-name">height</span>></span>
<span class="hljs-tag"><<span class="hljs-name">format</span>></span>R8G8B8<span class="hljs-tag"></<span class="hljs-name">format</span>></span>
<span class="hljs-tag"></<span class="hljs-name">image</span>></span>
<span class="hljs-tag"><<span class="hljs-name">clip</span>></span>
<span class="hljs-tag"><<span class="hljs-name">near</span>></span>0.02<span class="hljs-tag"></<span class="hljs-name">near</span>></span>
<span class="hljs-tag"><<span class="hljs-name">far</span>></span>300<span class="hljs-tag"></<span class="hljs-name">far</span>></span>
<span class="hljs-tag"></<span class="hljs-name">clip</span>></span>
<span class="hljs-tag"><<span class="hljs-name">noise</span>></span>
<span class="hljs-tag"><<span class="hljs-name">type</span>></span>gaussian<span class="hljs-tag"></<span class="hljs-name">type</span>></span>
<span class="hljs-tag"><<span class="hljs-name">mean</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">mean</span>></span>
<span class="hljs-tag"><<span class="hljs-name">stddev</span>></span>0.007<span class="hljs-tag"></<span class="hljs-name">stddev</span>></span>
<span class="hljs-tag"></<span class="hljs-name">noise</span>></span>
<span class="hljs-tag"></<span class="hljs-name">camera</span>></span>
<span class="hljs-tag"><<span class="hljs-name">plugin</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"camera_controller"</span> <span class="hljs-attr">filename</span>=<span class="hljs-string">"libgazebo_ros_camera.so"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">alwaysOn</span>></span>true<span class="hljs-tag"></<span class="hljs-name">alwaysOn</span>></span>
<span class="hljs-tag"><<span class="hljs-name">updateRate</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">updateRate</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cameraName</span>></span>bot/camera<span class="hljs-tag"></<span class="hljs-name">cameraName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">imageTopicName</span>></span>image_raw<span class="hljs-tag"></<span class="hljs-name">imageTopicName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">cameraInfoTopicName</span>></span>camera_info<span class="hljs-tag"></<span class="hljs-name">cameraInfoTopicName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">frameName</span>></span>camera_link<span class="hljs-tag"></<span class="hljs-name">frameName</span>></span>
<span class="hljs-tag"><<span class="hljs-name">hackBaseline</span>></span>0.07<span class="hljs-tag"></<span class="hljs-name">hackBaseline</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionK1</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionK1</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionK2</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionK2</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionK3</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionK3</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionT1</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionT1</span>></span>
<span class="hljs-tag"><<span class="hljs-name">distortionT2</span>></span>0.0<span class="hljs-tag"></<span class="hljs-name">distortionT2</span>></span>
<span class="hljs-tag"></<span class="hljs-name">plugin</span>></span>
<span class="hljs-tag"></<span class="hljs-name">sensor</span>></span>
<span class="hljs-tag"></<span class="hljs-name">gazebo</span>></span>
<span class="hljs-tag"></<span class="hljs-name">robot</span>></span>
</div></code></pre>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-52373163075242005472018-10-07T12:51:00.001-07:002018-10-07T12:52:11.299-07:00Ardupilot gazebo<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<ul>
<li><a href="https://github.com/SwiftGust/ardupilot_gazebo">reference</a></li>
</ul>
<h2 id="gazebo-plugin-for-arducopter">Gazebo Plugin for Arducopter</h2>
<ul>
<li>ubuntu 16.04</li>
<li>ROS Kinetic
<ul>
<li>gazebo 7</li>
</ul>
</li>
</ul>
<h3 id="preinstall">Preinstall</h3>
<pre class="hljs"><code><div>sudo apt-get install libgazebo7-dev
</div></code></pre>
<h3 id="install-and-build-plugin">Install and build plugin</h3>
<pre class="hljs"><code><div>cd <path>/ardupilot
git clone https://github.com/SwiftGust/ardupilot_gazebo
cd ardupilot_gazebo/
mkdir build
cd build
cmake ..
make -j4
sudo make install
</div></code></pre>
<h3 id="setup">Setup</h3>
<ul>
<li>Add worlds to gazebo resource search path</li>
<li>Add modules to gazebo model search path (<code>.bashrc</code>)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#Add to .bashrc</span>
<span class="hljs-comment"># init / export gazebo env variables</span>
<span class="hljs-built_in">source</span> /usr/share/gazebo/setup.sh
<span class="hljs-built_in">export</span> GAZEBO_RESOURCE_PATH=/ardupilot_gazebo/gazebo_worlds:<span class="hljs-variable">${GAZEBO_RESOURCE_PATH}</span>
<span class="hljs-comment">#modules</span>
<span class="hljs-built_in">export</span> GAZEBO_MODEL_PATH=~/ardupilot_gazebo/gazebo_models:<span class="hljs-variable">${GAZEBO_MODEL_PATH}</span>
<span class="hljs-built_in">source</span> ~/.bashrc
</div></code></pre>
<h3 id="run">Run</h3>
<ul>
<li>Terminal 1 (SITL)</li>
</ul>
<pre class="hljs"><code><div>sim_vehicle.py -v ArduCopter -f gazebo-iris -m --mav10 --map --console -I0
</div></code></pre>
<ul>
<li>
<p>v: Vehicle</p>
</li>
<li>
<p>f: Frame</p>
</li>
<li>
<p>m: mavproxy args</p>
<ul>
<li>mav10</li>
<li>map</li>
<li>console</li>
</ul>
</li>
<li>
<p>I:</p>
</li>
<li>
<p>Terminal 2 (gazebo)</p>
</li>
</ul>
<pre class="hljs"><code><div>gazebo --verbose iris_irlock_demo.world
</div></code></pre>
<pre class="hljs"><code><div>[Dbg] [ArduCopterPlugin.cc:722] ArduCopter controller online detected.
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv-HIGqrvBEBc5e-b2TNy03t5W9NOP3k9gE6FzYQfGAorjkTVm_flsqw-t8cT6FDWyPWRejBIJpiyxUsY6cIg7VRmXwb2XcD9Dvefpfw-DhiN18I4hfiIGjtfTPVxJh1lGBCB91c8pwto/s1600/2018-10-05-19-06-45.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgv-HIGqrvBEBc5e-b2TNy03t5W9NOP3k9gE6FzYQfGAorjkTVm_flsqw-t8cT6FDWyPWRejBIJpiyxUsY6cIg7VRmXwb2XcD9Dvefpfw-DhiN18I4hfiIGjtfTPVxJh1lGBCB91c8pwto/s320/2018-10-05-19-06-45.png" width="280" height="320" data-original-width="922" data-original-height="1053" /></a></div></p>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNWQHUQzylg5e0VqVdDC3znmuq1rpuN9Q0NmzlG4TL8l5fjAb7nZnMF__P4SaAb8LIzv_bwM7ea8P84YwIiif8suQyWuTZe8Zxdo1xSpA7h265zHyEwqizYgHYI6qIz5iMh7AcJsoc2uo/s1600/2018-10-05-19-08-26.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhNWQHUQzylg5e0VqVdDC3znmuq1rpuN9Q0NmzlG4TL8l5fjAb7nZnMF__P4SaAb8LIzv_bwM7ea8P84YwIiif8suQyWuTZe8Zxdo1xSpA7h265zHyEwqizYgHYI6qIz5iMh7AcJsoc2uo/s320/2018-10-05-19-08-26.png" width="281" height="320" data-original-width="924" data-original-height="1054" /></a></div></p>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-39191330723014655182018-10-02T22:43:00.000-07:002018-10-07T12:53:45.623-07:00RPi MAVROS Pixhawk connection<!DOCTYPE html>
<html>
<head>
<title>rpi_mcu_1.md</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h1 id="rpi-3-setup">RPi 3+ Setup</h1>
<h2 id="image">Image</h2>
<ul>
<li>Download preinstall ROS and OpenCV on Raspbian from <a href="https://medium.com/@rosbots/ready-to-use-image-raspbian-stretch-ros-opencv-324d6f8dcd96">ROSbots</a></li>
<li>Install (Etcher)[https://etcher.io/] Flash OS images to SD cards & USB drives, safely and easily</li>
<li>Flash the image</li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw2yN0shqWrRrd1QXxYf08SzjwTTI0FGAzrN0fKs_mIWQ3bWzterZ6lJM_bTSARZB6hDRzqH8uixVh1lCKaM2i2PDIlzySAqPPXHH8A6xIFTvuvIbSxGRypyXyiKU569_N4hw21eE1U6Q/s1600/2018-09-07-18-56-55.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgw2yN0shqWrRrd1QXxYf08SzjwTTI0FGAzrN0fKs_mIWQ3bWzterZ6lJM_bTSARZB6hDRzqH8uixVh1lCKaM2i2PDIlzySAqPPXHH8A6xIFTvuvIbSxGRypyXyiKU569_N4hw21eE1U6Q/s320/2018-09-07-18-56-55.png" width="320" height="160" data-original-width="797" data-original-height="398" /></a></div></p>
<h2 id="enabled-ssh">Enabled ssh</h2>
<ul>
<li>In the <code>boot</code> partition</li>
<li>Paste empty file named <code>ssh</code></li>
</ul>
<h2 id="enabled-wireless">Enabled wireless</h2>
<ul>
<li>In the <code>rootfs</code> partition goto <code>/etc/wpa_supplicant</code></li>
</ul>
<pre class="hljs"><code><div>cd <rootfs>/etc/wpa_supplicant
sudo vim wpa_supplicant.conf
</div></code></pre>
<ul>
<li>Paste and edit at the end of the file</li>
</ul>
<pre class="hljs"><code><div>network={
ssid="The_ESSID_from_earlier"
psk="Your_wifi_password"
}
</div></code></pre>
<h1 id="first-boot">First boot</h1>
<ul>
<li>Connect with ssh
<ul>
<li>user:pi password:rosbots!</li>
</ul>
</li>
</ul>
<h2 id="pi-config">Pi config</h2>
<ul>
<li>change locals</li>
<li>changed password</li>
<li>changed rootfs partition size</li>
</ul>
<pre class="hljs"><code><div>sudo raspi-config
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCtOfMdNlXpIFYy3rtonXpCxKwJzTUYGS3fpYnYEYgt36plT4XZplNCtEiql4QFEmBjUhAWfNv-yVkjpVZRvSfDKS0hlAPW2qyqlxMVS513KjBqsHMiyqf_cxXh0vTc2WSdjbiFkebIos/s1600/2018-10-01-19-45-03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCtOfMdNlXpIFYy3rtonXpCxKwJzTUYGS3fpYnYEYgt36plT4XZplNCtEiql4QFEmBjUhAWfNv-yVkjpVZRvSfDKS0hlAPW2qyqlxMVS513KjBqsHMiyqf_cxXh0vTc2WSdjbiFkebIos/s320/2018-10-01-19-45-03.png" width="320" height="95" data-original-width="820" data-original-height="244" /></a></div></p>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgny4fxwqTXuDwsdGsSNNllLfyOY15TaopvIxBdwSFxRzOQ_NvFdPrLpJJbKrpE-nDxOLtvkqWDk7S8OeZ6CTiYSQ933R-vAxxU0TqeTyPz9YUappkART-3xl1xPbbctL2ahvOMrcq9Lbc/s1600/2018-10-01-19-45-29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgny4fxwqTXuDwsdGsSNNllLfyOY15TaopvIxBdwSFxRzOQ_NvFdPrLpJJbKrpE-nDxOLtvkqWDk7S8OeZ6CTiYSQ933R-vAxxU0TqeTyPz9YUappkART-3xl1xPbbctL2ahvOMrcq9Lbc/s320/2018-10-01-19-45-29.png" width="320" height="88" data-original-width="858" data-original-height="235" /></a></div></p>
<h2 id="resize-swap-file">Resize swap file</h2>
<pre class="hljs"><code><div>sudo vim /etc/dphys-swapfile
<span class="hljs-comment"># update</span>
CONF_SWAPSIZE=1024
<span class="hljs-comment"># save and exit</span>
sudo /etc/init.d/dphys-swapfile stop
sudo /etc/init.d/dphys-swapfile start
<span class="hljs-comment">#check</span>
free -m
</div></code></pre>
<h1 id="install-mavlink-mavros-from-source">Install mavlink & mavros from source</h1>
<p>Use wstool utility for retrieve source
Use catkin tool for build</p>
<pre class="hljs"><code><div>sudo apt-get install python-catkin-tools python-rosinstall-generator
</div></code></pre>
<pre class="hljs"><code><div>sudo apt-get install libgeographic-dev
sudo apt-get install geographiclib-tools
sudo apt install python-future
</div></code></pre>
<ul>
<li>Create catkin workspace</li>
</ul>
<pre class="hljs"><code><div>mkdir - p ~/catkin_ws/src
cd catkin_ws
catkin init
</div></code></pre>
<ul>
<li>Crate MAVLink and MAVROS install instruction</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment"># Mavlink</span>
rosinstall_generator --rosdistro kinetic mavlink | tee /tmp/mavros.rosinstall
<span class="hljs-comment">#MAVROS</span>
rosinstall_generator --upstream
mavros | tee -a /tmp/mavros.rosinstall
</div></code></pre>
<pre class="hljs"><code><div>wstool merge -t src /tmp/mavros.rosinstall
wstool update -t src -j4
rosdep install --from-paths src --ignore-src -y
</div></code></pre>
<ul>
<li>Got Error</li>
</ul>
<pre class="hljs"><code><div>ERROR: the following packages/stacks could not have their rosdep keys resolved
to system dependencies:
mavros: No definition of [geographic_msgs] for OS [debian]
mavros_extras: No definition of [tf] for OS [debian]
test_mavros: No definition of [control_toolbox] for OS [debian]
mavros_msgs: No definition of [geographic_msgs] for OS [debian]
</div></code></pre>
<ul>
<li>Install dependencies (run rosinstall_generator for each of the packages)</li>
<li>Todo: dependency resolve ?</li>
</ul>
<pre class="hljs"><code><div>rosinstall_generator --rosdistro kinetic $XXX | tee -a /tmp/mavros.rosinstall
geographic_msgs
uuid_msgs
nav_msgs
tf
control_toolbox
actionlib_msgs
realtime_tools
diagnostic_msgs
urdf
eigen_conversions
tf2_ros
dynamic_reconfigure
tf2_eigen
rosconsole_bridge
orocos_kdl
visualization_msgs
angles
tf2_py
tf2
tf2_msgs
urdf_parser_plugin
diagnostic_updater
control_msgs
trajectory_msgs
actionlib
rosbag_migration_rule
</div></code></pre>
<ul>
<li>Run again</li>
</ul>
<pre class="hljs"><code><div>wstool merge -t src /tmp/mavros.rosinstall
wstool update -t src -j4
rosdep install --from-paths src --ignore-src -y
</div></code></pre>
<ul>
<li>Build</li>
</ul>
<pre class="hljs"><code><div>catkin build
</div></code></pre>
<ul>
<li>todo: Installer script</li>
</ul>
<pre class="hljs"><code><div>files=()
for file_name in files
do
rosinstall_generator --rosdistro kinetic $file_name | tee -a /tmp/mavros.rosinstall
done
</div></code></pre>
<h3 id="mavrosextra-compile-error">Mavros_extra compile error</h3>
<pre class="hljs"><code><div>tf2_eigen/tf2_eigen.h: No such file or directory
#include <tf2_eigen/tf2_eigen.h>
</div></code></pre>
<ul>
<li>check if tf2_eigen compile</li>
</ul>
<pre class="hljs"><code><div>Starting >>> tf2_eigen Starting >>> tf2_py Finished <<< mavros_msgs [ 11.3 seconds ]
Finished <<< tf2_eigen [ 0.9 seconds ]
</div></code></pre>
<ul>
<li>Add tf2_eigen to find_package (CMakeLists.txt)</li>
</ul>
<pre class="hljs"><code><div>find_package(catkin REQUIRED COMPONENTS
mavros
roscpp
mavros_msgs
sensor_msgs
geometry_msgs
std_msgs
visualization_msgs
urdf
tf
tf2_eigen
)
</div></code></pre>
<h2 id="install-geographiclib">install GeographicLib</h2>
<pre class="hljs"><code><div>- Download from git `install_geographiclib_dataset.sh`
- Run it
</div></code></pre>
<h1 id="connect-with-usb">Connect with USB</h1>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgklP72fqf91NsWRIXNQwNt9-2Tkr0tdcp8Ffkmgnp06KDb_zGZtYK-SATZHbPVT6i24AxEaaQfiob-Hf_t6J_J08rKAJwmKTTg0ACH_fNVBoOgspdih3usdv4bmK1baTFDchR0VVUcgME/s1600/2018-10-02-20-15-00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgklP72fqf91NsWRIXNQwNt9-2Tkr0tdcp8Ffkmgnp06KDb_zGZtYK-SATZHbPVT6i24AxEaaQfiob-Hf_t6J_J08rKAJwmKTTg0ACH_fNVBoOgspdih3usdv4bmK1baTFDchR0VVUcgME/s320/2018-10-02-20-15-00.png" width="271" height="320" data-original-width="347" data-original-height="410" /></a></div></p>
<ul>
<li>Connect pixhawk usb to RPI usb</li>
<li>Use default fcu_url <code>"/dev/ttyACM0:57600"</code></li>
<li>Note Don't forget to source (add to <code>.bashrc</code>)</li>
<li>From RPi run <code>roslaunch mavros apm.launch</code></li>
<li>Run diagnostic</li>
</ul>
<pre class="hljs"><code><div>rostopic echo -n1 /diagnostics
level: 0
name: "mavros: Heartbeat"
message: "Normal"
hardware_id: "/dev/ttyACM0:57600"
values:
-
key: "Heartbeats since startup"
value: "10"
-
key: "Frequency (Hz)"
value: "0.948061"
-
key: "Vehicle type"
value: "Quadrotor"
-
key: "Autopilot type"
value: "ArduPilotMega / ArduCopter"
-
key: "Mode"
value: "GUIDED"
-
key: "System status"
value: "Standby"
</div></code></pre>
<ul>
<li>Note: if No GPS data</li>
</ul>
<pre class="hljs"><code><div> name: "mavros: GPS"
message: "3D fix"
hardware_id: "/dev/ttyACM0:57600"
values:
-
key: "Satellites visible"
value: "0"
</div></code></pre>
<ul>
<li>Run <code>rosrun mavros mavsys rate --all 10</code> (need configure stream rate parameters.)</li>
</ul>
<h1 id="todo-connect-serial">Todo: connect Serial</h1>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-67913269247042871252018-09-11T09:13:00.001-07:002018-10-27T15:48:22.880-07:00CMake<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h2 id="reference">Reference</h2>
<p><a href="https://medium.com/@onur.dundar1/cmake-tutorial-585dd180109b">CMake Tutorial</a></p>
<p>CMake is designed to be used in conjunction with the native build environment. configuration files placed in each source directory (called CMakeLists.txt files) are used to generate standard build files <strong>Makefile</strong></p>
<p>CMakeLists.txt places</p>
<ul>
<li>Source folder</li>
<li>Root of the source tree of any application, library</li>
<li>For each module that can be compile and build separately</li>
</ul>
<h2 id="hello-cmake">Hello cmake</h2>
<ul>
<li>source</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><iostream></span></span>
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">(<span class="hljs-keyword">void</span>)</span> </span>{
<span class="hljs-built_in">std</span>::<span class="hljs-built_in">cout</span> << <span class="hljs-string">"Hello World"</span> << <span class="hljs-built_in">std</span>::<span class="hljs-built_in">endl</span>;
<span class="hljs-keyword">return</span>(<span class="hljs-number">0</span>);
}
</div></code></pre>
<ul>
<li>CMakeLists.txt (with the source folder)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment"># Set the minimum required version of cmake for a project</span>
<span class="hljs-keyword">cmake_minimum_required</span>(VERSION <span class="hljs-number">2.8</span>)
<span class="hljs-comment"># Project name</span>
<span class="hljs-keyword">project</span>(hello)
<span class="hljs-comment"># Add an executable to the project using the specified source files</span>
<span class="hljs-keyword">add_executable</span>(hello hello.cpp)
</div></code></pre>
<ul>
<li>Run</li>
</ul>
<pre class="hljs"><code><div>cmake .
make
</div></code></pre>
<h3 id="build-and-bin-sub-folders">Build and bin sub folders</h3>
<p>To keep files in place , and hold all cmake file in one place</p>
<pre class="hljs"><code><div>mkdir build
cd build
cmake ..
make
</div></code></pre>
<p>Project structure</p>
<pre class="hljs"><code><div>p1
├── bin
├── build
├── src
| └── CMakeLists.txt
└─ CMakeLists.txt
</div></code></pre>
<ul>
<li>Source CMakeLists.txt</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">cmake_minimum_required</span>(VERSION <span class="hljs-number">2.8</span>)
<span class="hljs-keyword">project</span>(hello)
<span class="hljs-comment"># Assign value to variable (make output folder)</span>
<span class="hljs-keyword">set</span>(EXECUTABLE_OUTPUT_PATH <span class="hljs-variable">${CMAKE_SOURCE_DIR}</span>/bin)
<span class="hljs-comment"># Adds sub folder to build</span>
<span class="hljs-keyword">add_subdirectory</span>(src)
</div></code></pre>
<ul>
<li>Root src CMakeLists.txt</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment"># Print message</span>
<span class="hljs-keyword">message</span> (<span class="hljs-string">"main application"</span>)
<span class="hljs-keyword">add_executable</span>(hello test.cpp)
</div></code></pre>
<ul>
<li>from build sub folder</li>
</ul>
<pre class="hljs"><code><div>cmake ..
make
</div></code></pre>
<h2 id="cmake-variables">CMake variables</h2>
<p><a href="https://cmake.org/cmake/help/v3.0/manual/cmake-variables.7.html#manual:cmake-variables%287%29">cmake-variables</a></p>
<ul>
<li>Set variable data with <code>set function/macro</code></li>
<li>Access value with <code>${variable_name}</code></li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">set</span>(CMAKE_CXX_STANDARD <span class="hljs-number">11</span>)
<span class="hljs-keyword">message</span>(<span class="hljs-string">"CXX Standard:"</span> <span class="hljs-variable">${CMAKE_CXX_STANDARD}</span>)
</div></code></pre>
<pre class="hljs"><code><div><span class="hljs-keyword">set</span>(CMAKE_CXX_FLAGS <span class="hljs-string">"${CMAKE_CXX_FLAGS} -Wall"</span>)
</div></code></pre>
<ul>
<li>Custom variables</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">set</span>(TRIAL_VARIABLE <span class="hljs-string">"VALUE"</span>)
<span class="hljs-keyword">message</span>(<span class="hljs-string">"${TRIAL_VARIABLE}"</span>)
</div></code></pre>
<h2 id="building-a-library-with-cmake">Building a Library with cmake</h2>
<ul>
<li>Add lib/math sub folder under src</li>
<li>Add header and source file</li>
<li>Change main app to use the new functionality</li>
</ul>
<h3 id="code">code</h3>
<ul>
<li>header file (src/lib/math/calc.hpp)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">ifndef</span> CALC_HPP</span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> CALC_HPP</span>
<span class="hljs-keyword">namespace</span> math {
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">calc</span>{</span>
<span class="hljs-keyword">public</span>:
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">sum</span><span class="hljs-params">(<span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> &a, <span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> &b)</span></span>;
};
}
<span class="hljs-meta">#<span class="hljs-meta-keyword">endif</span></span>
</div></code></pre>
<ul>
<li>implementation (src/lib/math/calc.cpp)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">"calc.hpp"</span></span>
<span class="hljs-keyword">int</span> math::calc::sum(<span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> &a, <span class="hljs-keyword">const</span> <span class="hljs-keyword">int</span> &b){
<span class="hljs-keyword">return</span> a + b;
}
</div></code></pre>
<ul>
<li>main</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><iostream></span></span>
<span class="hljs-meta">#<span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">"lib/math/calc.hpp"</span></span>
<span class="hljs-keyword">using</span> <span class="hljs-keyword">namespace</span> <span class="hljs-built_in">std</span>;
<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">(<span class="hljs-keyword">void</span>)</span> </span>{
math::calc calc;
<span class="hljs-keyword">int</span> sum = calc.sum(<span class="hljs-number">3</span>, <span class="hljs-number">4</span>);
<span class="hljs-built_in">cout</span> << <span class="hljs-string">"3+4="</span> << sum << <span class="hljs-built_in">endl</span>;
<span class="hljs-keyword">return</span>(<span class="hljs-number">0</span>);
}
</div></code></pre>
<ul>
<li>CMakeLists.txt</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-keyword">cmake_minimum_required</span>(VERSION <span class="hljs-number">2.8</span>)
<span class="hljs-keyword">project</span>(hello)
<span class="hljs-comment"># set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)</span>
<span class="hljs-keyword">set</span>(EXECUTABLE_OUTPUT_PATH <span class="hljs-variable">${CMAKE_SOURCE_DIR}</span>/bin)
<span class="hljs-keyword">set</span>(CMAKE_LIBRARY_OUTPUT_DIRECTORY <span class="hljs-variable">${CMAKE_SOURCE_DIR}</span>/lib)
<span class="hljs-comment"># CMAKE_ARCHIVE_OUTPUT_DIRECTORY</span>
<span class="hljs-keyword">set</span>(CMAKE_CXX_STANDARD <span class="hljs-number">11</span>)
<span class="hljs-keyword">set</span>(CMAKE_CXX_FLAGS <span class="hljs-string">"${CMAKE_CXX_FLAGS} -Wall"</span>)
<span class="hljs-keyword">add_subdirectory</span>(src)
</div></code></pre>
<ul>
<li>CMakeLists.txt (src)</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment"># create shared library</span>
<span class="hljs-keyword">add_library</span>(math SHARED lib/math/calc.cpp)
<span class="hljs-keyword">add_executable</span>(hello test.cpp)
<span class="hljs-comment"># link libmath.so to executable</span>
<span class="hljs-keyword">target_link_libraries</span>(hello math)
</div></code></pre>
<ul>
<li>It's create shared library libxxx.so at <code>lib</code> sub folder</li>
<li>It's create binary use's the lib in <code>bin</code> sub folder</li>
</ul>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-23744178939131512032018-09-07T06:05:00.002-07:002018-09-07T06:16:19.937-07:00ROS REP and CodeStyle<b>REP - ROS Enhancement Proposal </b><br />
<br />
<ul>
<li><a href="http://www.ros.org/reps/rep-0103.html">REP-103</a>: Standard Units of Measure and Coordinate Conventions</li>
<li><a href="http://www.ros.org/reps/rep-0144.html" target="_blank">REP-144</a>: ROS Package Naming</li>
</ul>
<br />
<br />
<b>ROS Code Style Guide</b><br />
<ul>
<li><a href="http://wiki.ros.org/PyStyleGuide" target="_blank">PyStyleGuide:</a> ROS Python style guide</li>
</ul>
<br />
<b>ROS Projects Tips </b><br />
<ul>
<li><b><a href="http://wiki.ros.org/ROS/Tutorials/Roslaunch%20tips%20for%20larger%20projects" target="_blank">Roslaunch tips for large projects</a> </b></li>
</ul>
<ul>
</ul>
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-2154993131535142612018-09-06T22:02:00.002-07:002018-09-06T22:02:57.093-07:00Gazebo and URDF model<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<a href="https://github.com/amire2000/simulation_ws/tree/master/src/demo_gazebo">source code</a>
<h3 id="catkin-package">Catkin package</h3>
<pre class="hljs"><code><div>catkin_create_pkg demo_gazebo rospy
cd demo_gazebo
mkdir launch
mkdir urdf
</div></code></pre>
<h2 id="minimal-urdf-file">Minimal urdf file</h2>
<h3 id="urdf-model-link-mast-have-inertia">URDF model <code>link</code> mast have <code>inertia</code></h3>
<p><a href="http://answers.gazebosim.org/question/4372/the-inertia-matrix-explained/">The inertia matrix explained</a></p>
<pre class="hljs"><code><div><span class="php"><span class="hljs-meta"><?</span>xml version=<span class="hljs-string">"1.0"</span><span class="hljs-meta">?></span></span>
<span class="hljs-tag"><<span class="hljs-name">robot</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"robot"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">link</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"base_link"</span>></span>
<span class="hljs-tag"><<span class="hljs-name">collision</span>></span>
<span class="hljs-tag"><<span class="hljs-name">origin</span> <span class="hljs-attr">xyz</span>=<span class="hljs-string">"0 0 1"</span> <span class="hljs-attr">rpy</span>=<span class="hljs-string">"0 0 0"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"><<span class="hljs-name">box</span> <span class="hljs-attr">size</span>=<span class="hljs-string">"2 2 2"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"></<span class="hljs-name">collision</span>></span>
<span class="hljs-tag"><<span class="hljs-name">visual</span>></span>
<span class="hljs-tag"><<span class="hljs-name">origin</span> <span class="hljs-attr">xyz</span>=<span class="hljs-string">"0 0 1"</span> <span class="hljs-attr">rpy</span>=<span class="hljs-string">"0 0 0"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"><<span class="hljs-name">box</span> <span class="hljs-attr">size</span>=<span class="hljs-string">"2 2 2"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">geometry</span>></span>
<span class="hljs-tag"><<span class="hljs-name">material</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"orange"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">visual</span>></span>
<span class="hljs-tag"><<span class="hljs-name">inertial</span>></span>
<span class="hljs-tag"><<span class="hljs-name">origin</span> <span class="hljs-attr">xyz</span>=<span class="hljs-string">"0 0 1"</span> <span class="hljs-attr">rpy</span>=<span class="hljs-string">"0 0 0"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">mass</span> <span class="hljs-attr">value</span>=<span class="hljs-string">"1"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">inertia</span>
<span class="hljs-attr">ixx</span>=<span class="hljs-string">"1.0"</span> <span class="hljs-attr">ixy</span>=<span class="hljs-string">"0.0"</span> <span class="hljs-attr">ixz</span>=<span class="hljs-string">"0.0"</span>
<span class="hljs-attr">iyy</span>=<span class="hljs-string">"1.0"</span> <span class="hljs-attr">iyz</span>=<span class="hljs-string">"0.0"</span>
<span class="hljs-attr">izz</span>=<span class="hljs-string">"1.0"</span>/></span>
<span class="hljs-tag"></<span class="hljs-name">inertial</span>></span>>
<span class="hljs-tag"></<span class="hljs-name">link</span>></span>
<span class="hljs-tag"></<span class="hljs-name">robot</span>></span>
</div></code></pre>
<h2 id="spawn-models">Spawn models</h2>
<ul>
<li>Using launch file</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-tag"><<span class="hljs-name">launch</span>></span>
<span class="hljs-tag"><<span class="hljs-name">param</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"robot_description"</span> <span class="hljs-attr">textfile</span>=<span class="hljs-string">"$(find demo_gazebo)/urdf/robot_description.urdf"</span> /></span>
<span class="hljs-tag"><<span class="hljs-name">include</span> <span class="hljs-attr">file</span>=<span class="hljs-string">"$(find gazebo_ros)/launch/empty_world.launch"</span>/></span>
<span class="hljs-tag"><<span class="hljs-name">node</span> <span class="hljs-attr">name</span>=<span class="hljs-string">"spawn_urdf"</span> <span class="hljs-attr">pkg</span>=<span class="hljs-string">"gazebo_ros"</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"spawn_model"</span> <span class="hljs-attr">args</span>=<span class="hljs-string">"-param robot_description -urdf -model my_robot"</span> /></span>
<span class="hljs-tag"></<span class="hljs-name">launch</span>></span>
</div></code></pre>
<ul>
<li>Using rosrun</li>
</ul>
<pre class="hljs"><code><div>rosrun gazebo_ros spawn_model -file `rospack find demo_gazebo`/urdf/robot_description.urdf -urdf -z 1 -model my_robot
</div></code></pre>
<h2 id="gazebo-services">Gazebo services</h2>
<ul>
<li>Check if mode loaded</li>
</ul>
<pre class="hljs"><code><div>rosservice call /gazebo/get_world_properties
sim_time: 1155.376
model_names: [ground_plane, my_robot]
rendering_enabled: True
success: True
</div></code></pre>
<ul>
<li>Delete model</li>
</ul>
<pre class="hljs"><code><div>rosservice call /gazebo/delete_model "model_name: 'my_robot'"
success: True
status_message: "DeleteModel: successfully deleted model"
</div></code></pre>
<h2 id="ros-python-node">ROS python node</h2>
<ul>
<li>Call service to insert model into</li>
</ul>
<pre class="hljs"><code><div><span class="hljs-comment">#! /usr/bin/env python</span>
<span class="hljs-keyword">import</span> rospy
<span class="hljs-keyword">from</span> gazebo_msgs.srv <span class="hljs-keyword">import</span> SpawnModel
<span class="hljs-keyword">from</span> geometry_msgs.msg <span class="hljs-keyword">import</span> Pose
rospy.init_node(<span class="hljs-string">'insert_object'</span>,log_level=rospy.INFO)
initial_pose = Pose()
initial_pose.position.x = <span class="hljs-number">1</span>
initial_pose.position.y = <span class="hljs-number">1</span>
initial_pose.position.z = <span class="hljs-number">1</span>
f = open(<span class="hljs-string">'/home/user/simulation_ws/src/demo_gazebo/urdf/robot_description.urdf'</span>,<span class="hljs-string">'r'</span>)
urdff = f.read()
rospy.wait_for_service(<span class="hljs-string">'gazebo/spawn_urdf_model'</span>)
spawn_model_proxy = rospy.ServiceProxy(<span class="hljs-string">'gazebo/spawn_urdf_model'</span>, SpawnModel)
spawn_model_proxy(<span class="hljs-string">"some_robot_name"</span>, urdff, <span class="hljs-string">"robotos_name_space"</span>, initial_pose, <span class="hljs-string">"world"</span>)
</div></code></pre>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-49793037755551774902018-09-04T23:38:00.001-07:002018-09-06T21:52:10.503-07:00PX4 SITL mavros and gazebo<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<ul>
<li><a href="https://dev.px4.io/en/simulation/ros_interface.html">Reference</a></li>
<li><a href="https://404warehouse.net/2016/07/11/px4-software-in-the-loopsitl-simulation-on-gazebo/">404warehouse</a></li>
</ul>
<h2 id="setup-and-run">Setup and run</h2>
<ul>
<li>Terminal 1 Setting environment</li>
</ul>
<pre class="hljs"><code><div>cd <Firmware_clone>
make posix_sitl_default gazebo
source Tools/setup_gazebo.bash $(pwd) $(pwd)/build/posix_sitl_default
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)
export ROS_PACKAGE_PATH=$ROS_PACKAGE_PATH:$(pwd)/Tools/sitl_gazebo
</div></code></pre>
<ul>
<li>Terminal 1 (launch gazebo and SITL)</li>
</ul>
<pre class="hljs"><code><div>roslaunch px4 posix_sitl.launch
</div></code></pre>
<ul>
<li>Terminal 2 (launch mavros)</li>
</ul>
<pre class="hljs"><code><div>roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"
</div></code></pre>
<ul>
<li>Terminal 3 (mavros commands: call services)</li>
</ul>
<pre class="hljs"><code><div>rosservice call /mavros/set_mode "base_mode: 0
custom_mode: 'OFFBOARD'"
rosservice call /mavros/cmd/arming "value: true"
rosservice call /mavros/cmd/takeoff "{min_pitch: 0.0, yaw: 0.0, latitude: 0.0, longitude: 0.0, altitude: 10.0}"
</div></code></pre>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO_DP3qXY50XeUwMBkkQvQmgmPRZi3OvcDbzPej6q3sMUb3k9YRCqxs3cuuzQw_JmbfoRZrwQNy28nv7cMhVjMyoRmMtWbFl-7406mrDMoiMb-iIQtaAjRLEVopRxPSxQ54XKAUrVaaf4/s1600/2018-09-05-09-01-01.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgO_DP3qXY50XeUwMBkkQvQmgmPRZi3OvcDbzPej6q3sMUb3k9YRCqxs3cuuzQw_JmbfoRZrwQNy28nv7cMhVjMyoRmMtWbFl-7406mrDMoiMb-iIQtaAjRLEVopRxPSxQ54XKAUrVaaf4/s400/2018-09-05-09-01-01.png" width="352" height="400" data-original-width="928" data-original-height="1056" /></a></div></p>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-886116675049261452018-09-03T22:59:00.000-07:002018-09-03T22:59:39.920-07:00Pixhawk first connection<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<ul>
<li>Connect to usb</li>
<li>Understand LED's</li>
<li>Write some dronekit code read heartbeat</li>
<li>Read GPS data with dronekit</li>
<li></li>
</ul>
<h3 id="connect-to-usb">Connect to USB</h3>
<ul>
<li>dmsg</li>
</ul>
<pre class="hljs"><code><div>[768651.390811] usb 3-2: Product: PX4 FMU v2.x
[768651.390814] usb 3-2: Manufacturer: 3D Robotics
[768651.390816] usb 3-2: SerialNumber: 0
[768651.391528] cdc_acm 3-2:1.0: ttyACM0: USB ACM device
</div></code></pre>
<h3 id="leds">LED's</h3>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2w3D7l7zbrEJA2ujeHqtIkIYdFGUkLmY1FoUtRaamBZbEpvjayBFp9aFnLOjtjJts9bcn3gTZHxwFAuHMoywb1VPTA2Lq_f06aZa2Fhv00Mc2PeWPzr95yofKxirZcBKEiVDmDhHm_nM/s1600/2018-09-04-07-43-21.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2w3D7l7zbrEJA2ujeHqtIkIYdFGUkLmY1FoUtRaamBZbEpvjayBFp9aFnLOjtjJts9bcn3gTZHxwFAuHMoywb1VPTA2Lq_f06aZa2Fhv00Mc2PeWPzr95yofKxirZcBKEiVDmDhHm_nM/s400/2018-09-04-07-43-21.png" width="400" height="88" data-original-width="700" data-original-height="154" /></a></div></p>
<ul>
<li><strong>Flashing blue</strong>: Disarmed, no GPS lock found</li>
<li><strong>Flashing green</strong>: Disarmed (ready to arm), GPS lock acquired.</li>
<li>Full list: http://ardupilot.org/plane/docs/common-leds-pixhawk.html</li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2TyWCp8IjFqNzw23OJrroMbaLpKQKBMuFZUumEfspE55hr49qR-2k5a4rpg2ES79HYANSC542Qo6x2f6eagJlMd6Tqqex8aOV1C2fsrfeFZCwdFmL7n37NEASzZMF2OoLX1trevwwsi4/s1600/2018-09-04-07-46-55.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2TyWCp8IjFqNzw23OJrroMbaLpKQKBMuFZUumEfspE55hr49qR-2k5a4rpg2ES79HYANSC542Qo6x2f6eagJlMd6Tqqex8aOV1C2fsrfeFZCwdFmL7n37NEASzZMF2OoLX1trevwwsi4/s400/2018-09-04-07-46-55.png" width="400" height="225" data-original-width="1280" data-original-height="720" /></a></div></p>
<h3 id="connect-gps-and-compass">Connect GPS and Compass</h3>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgImzWCKG6nHG_gufyZhN_9ZKgfi5kyxCBhAulRYUOLPsfyss0bEvZ0utgaiQOuG3Lry4tNXLW5ONLd6kZ1umasndtqU4BgdVKhiewZRcj9GVFYcnnvBmSmdbW34a1Uu_xpzkS_X0n6-EI/s1600/2018-09-04-07-57-55.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgImzWCKG6nHG_gufyZhN_9ZKgfi5kyxCBhAulRYUOLPsfyss0bEvZ0utgaiQOuG3Lry4tNXLW5ONLd6kZ1umasndtqU4BgdVKhiewZRcj9GVFYcnnvBmSmdbW34a1Uu_xpzkS_X0n6-EI/s400/2018-09-04-07-57-55.png" width="400" height="181" data-original-width="882" data-original-height="399" /></a></div></p>
<ul>
<li>LED go to blinking green</li>
<li>my GPS led blink with green led's</li>
</ul>
<h2 id="dronekit-hello">Dronekit hello</h2>
<pre class="hljs"><code><div><span class="hljs-comment">#!/usr/bin/env python</span>
<span class="hljs-keyword">from</span> dronekit <span class="hljs-keyword">import</span> connect, VehicleMode
connection_string = <span class="hljs-string">"/dev/ttyACM0"</span>
<span class="hljs-comment"># Connect to the Vehicle.</span>
print(<span class="hljs-string">"Connecting to vehicle on: %s"</span> % (connection_string,))
vehicle = connect(connection_string, wait_ready=<span class="hljs-keyword">True</span>)
<span class="hljs-comment"># Get some vehicle attributes (state)</span>
<span class="hljs-keyword">print</span> <span class="hljs-string">"Get some vehicle attribute values:"</span>
<span class="hljs-keyword">print</span> <span class="hljs-string">" GPS: %s"</span> % vehicle.gps_0
<span class="hljs-keyword">print</span> <span class="hljs-string">" Battery: %s"</span> % vehicle.battery
<span class="hljs-keyword">print</span> <span class="hljs-string">" Last Heartbeat: %s"</span> % vehicle.last_heartbeat
<span class="hljs-keyword">print</span> <span class="hljs-string">" Is Armable?: %s"</span> % vehicle.is_armable
<span class="hljs-keyword">print</span> <span class="hljs-string">" System status: %s"</span> % vehicle.system_status.state
<span class="hljs-keyword">print</span> <span class="hljs-string">" Mode: %s"</span> % vehicle.mode.name <span class="hljs-comment"># settable</span>
<span class="hljs-comment"># Close vehicle object before exiting script</span>
vehicle.close()
</div></code></pre>
<h2 id="read-gps-data">Read GPS data</h2>
<pre class="hljs"><code><div><span class="hljs-comment">#!/usr/bin/env python</span>
<span class="hljs-keyword">from</span> dronekit <span class="hljs-keyword">import</span> connect, VehicleMode
<span class="hljs-keyword">import</span> time
connection_string = <span class="hljs-string">"/dev/ttyACM0"</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">log_gps</span><span class="hljs-params">(self, name, msg)</span>:</span>
<span class="hljs-keyword">print</span> msg
<span class="hljs-comment"># Connect to the Vehicle.</span>
print(<span class="hljs-string">"Connecting to vehicle on: %s"</span> % (connection_string,))
vehicle = connect(connection_string, wait_ready=<span class="hljs-keyword">True</span>)
<span class="hljs-comment">#vehicle.add_message_listener('GLOBAL_POSITION_INT', log_gps)</span>
vehicle.add_message_listener(<span class="hljs-string">'GPS_RAW_INT'</span>, log_gps)
time.sleep(<span class="hljs-number">5</span>)
vehicle.close()
</div></code></pre>
<p>Result</p>
<ul>
<li><strong>GPS_RAW_INT</strong>: The global position, as returned by the Global Positioning System
(GPS). This is NOT the global position estimate of the sytem, but
rather a RAW sensor value. See message GLOBAL_POSITION for the global
position estimate. Coordinate frame is right-handed, Z-axis up (GPS
frame)</li>
</ul>
<pre class="hljs"><code><div>GPS_RAW_INT {time_usec : 4246687000, fix_type : 4, lat : 324283000, lon : 350107200, alt : 45700, eph : 98, epv : 171, vel : 14, cog : 23071, satellites_visible : 8}
</div></code></pre>
<ul>
<li><strong>GLOBAL_POSITION_INT:</strong> fused GPS and accelerometers). The
position is in GPS-frame (right-handed, Z-up)</li>
</ul>
<pre class="hljs"><code><div>GLOBAL_POSITION_INT {time_boot_ms : 2848710, lat : 324284000, lon : 350107830, alt : 99400, relative_alt : 8000, vx : -17, vy : 9, vz : 8, hdg : 4893}
</div></code></pre>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="http://ardupilot.org/plane/docs/common-pixhawk-overview.html">Pixhawk Overview</a></li>
<li><a href="http://ardupilot.org/copter/docs/common-leds-pixhawk.html">LEDs (Pixhawk)</a></li>
<li><a href="https://www.samba.org/tridge/UAV/pymavlink/apidocs/mavlink.MAVLink_global_position_int_message.html">GLOBAL_POSITION_INT</a></li>
</ul>
</body>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-3858091316131508753.post-33218966601029389222018-09-02T22:51:00.000-07:002018-09-02T22:51:45.746-07:00Ardupilot and MAVROS<style>
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
body {
font-family: "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
font-size: 14px;
padding: 0 12px;
line-height: 22px;
word-wrap: break-word;
}
#code-csp-warning {
position: fixed;
top: 0;
right: 0;
color: white;
margin: 16px;
text-align: center;
font-size: 12px;
font-family: sans-serif;
background-color:#444444;
cursor: pointer;
padding: 6px;
box-shadow: 1px 1px 1px rgba(0,0,0,.25);
}
#code-csp-warning:hover {
text-decoration: none;
background-color:#007acc;
box-shadow: 2px 2px 2px rgba(0,0,0,.25);
}
body.scrollBeyondLastLine {
margin-bottom: calc(100vh - 22px);
}
body.showEditorSelection .code-line {
position: relative;
}
body.showEditorSelection .code-active-line:before,
body.showEditorSelection .code-line:hover:before {
content: "";
display: block;
position: absolute;
top: 0;
left: -12px;
height: 100%;
}
body.showEditorSelection li.code-active-line:before,
body.showEditorSelection li.code-line:hover:before {
left: -30px;
}
.vscode-light.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(0, 0, 0, 0.15);
}
.vscode-light.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(0, 0, 0, 0.40);
}
.vscode-dark.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 255, 255, 0.4);
}
.vscode-dark.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 255, 255, 0.60);
}
.vscode-high-contrast.showEditorSelection .code-active-line:before {
border-left: 3px solid rgba(255, 160, 0, 0.7);
}
.vscode-high-contrast.showEditorSelection .code-line:hover:before {
border-left: 3px solid rgba(255, 160, 0, 1);
}
img {
max-width: 100%;
max-height: 100%;
}
a {
color: #4080D0;
text-decoration: none;
}
a:focus,
input:focus,
select:focus,
textarea:focus {
outline: 1px solid -webkit-focus-ring-color;
outline-offset: -1px;
}
hr {
border: 0;
height: 2px;
border-bottom: 2px solid;
}
h1 {
padding-bottom: 0.3em;
line-height: 1.2;
border-bottom-width: 1px;
border-bottom-style: solid;
}
h1, h2, h3 {
font-weight: normal;
}
h1 code,
h2 code,
h3 code,
h4 code,
h5 code,
h6 code {
font-size: inherit;
line-height: auto;
}
a:hover {
color: #4080D0;
text-decoration: underline;
}
table {
border-collapse: collapse;
}
table > thead > tr > th {
text-align: left;
border-bottom: 1px solid;
}
table > thead > tr > th,
table > thead > tr > td,
table > tbody > tr > th,
table > tbody > tr > td {
padding: 5px 10px;
}
table > tbody > tr + tr > td {
border-top: 1px solid;
}
blockquote {
margin: 0 7px 0 5px;
padding: 0 16px 0 10px;
border-left: 5px solid;
}
code {
font-family: Menlo, Monaco, Consolas, "Droid Sans Mono", "Courier New", monospace, "Droid Sans Fallback";
font-size: 14px;
line-height: 19px;
}
body.wordWrap pre {
white-space: pre-wrap;
}
.mac code {
font-size: 12px;
line-height: 18px;
}
pre:not(.hljs),
pre.hljs code > div {
padding: 16px;
border-radius: 3px;
overflow: auto;
}
/** Theming */
.vscode-light,
.vscode-light pre code {
color: rgb(30, 30, 30);
}
.vscode-dark,
.vscode-dark pre code {
color: #DDD;
}
.vscode-high-contrast,
.vscode-high-contrast pre code {
color: white;
}
.vscode-light code {
color: #A31515;
}
.vscode-dark code {
color: #D7BA7D;
}
.vscode-light pre:not(.hljs),
.vscode-light code > div {
background-color: rgba(220, 220, 220, 0.4);
}
.vscode-dark pre:not(.hljs),
.vscode-dark code > div {
background-color: rgba(10, 10, 10, 0.4);
}
.vscode-high-contrast pre:not(.hljs),
.vscode-high-contrast code > div {
background-color: rgb(0, 0, 0);
}
.vscode-high-contrast h1 {
border-color: rgb(0, 0, 0);
}
.vscode-light table > thead > tr > th {
border-color: rgba(0, 0, 0, 0.69);
}
.vscode-dark table > thead > tr > th {
border-color: rgba(255, 255, 255, 0.69);
}
.vscode-light h1,
.vscode-light hr,
.vscode-light table > tbody > tr + tr > td {
border-color: rgba(0, 0, 0, 0.18);
}
.vscode-dark h1,
.vscode-dark hr,
.vscode-dark table > tbody > tr + tr > td {
border-color: rgba(255, 255, 255, 0.18);
}
.vscode-light blockquote,
.vscode-dark blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.vscode-high-contrast blockquote {
background: transparent;
border-color: #fff;
}
</style>
<style>
/* Tomorrow Theme */
/* http://jmblog.github.com/color-themes-for-google-code-highlightjs */
/* Original theme - https://github.com/chriskempson/tomorrow-theme */
/* Tomorrow Comment */
.hljs-comment,
.hljs-quote {
color: #8e908c;
}
/* Tomorrow Red */
.hljs-variable,
.hljs-template-variable,
.hljs-tag,
.hljs-name,
.hljs-selector-id,
.hljs-selector-class,
.hljs-regexp,
.hljs-deletion {
color: #c82829;
}
/* Tomorrow Orange */
.hljs-number,
.hljs-built_in,
.hljs-builtin-name,
.hljs-literal,
.hljs-type,
.hljs-params,
.hljs-meta,
.hljs-link {
color: #f5871f;
}
/* Tomorrow Yellow */
.hljs-attribute {
color: #eab700;
}
/* Tomorrow Green */
.hljs-string,
.hljs-symbol,
.hljs-bullet,
.hljs-addition {
color: #718c00;
}
/* Tomorrow Blue */
.hljs-title,
.hljs-section {
color: #4271ae;
}
/* Tomorrow Purple */
.hljs-keyword,
.hljs-selector-tag {
color: #8959a8;
}
.hljs {
display: block;
overflow-x: auto;
color: #4d4d4c;
padding: 0.5em;
}
.hljs-emphasis {
font-style: italic;
}
.hljs-strong {
font-weight: bold;
}
</style>
<style>
/*
* Markdown PDF CSS
*/
body {
font-family: "Meiryo", "Segoe WPC", "Segoe UI", "SFUIText-Light", "HelveticaNeue-Light", sans-serif, "Droid Sans Fallback";
}
pre {
background-color: #f8f8f8;
border: 1px solid #cccccc;
border-radius: 3px;
overflow-x: auto;
white-space: pre-wrap;
overflow-wrap: break-word;
}
pre:not(.hljs) {
padding: 23px;
line-height: 19px;
}
blockquote {
background: rgba(127, 127, 127, 0.1);
border-color: rgba(0, 122, 204, 0.5);
}
.emoji {
height: 1.4em;
}
/* for inline code */
:not(pre):not(.hljs) > code {
color: #C9AE75; /* Change the old color so it seems less like an error */
font-size: inherit;
}
/* Page Break : use <div class="page"/> to insert page break
-------------------------------------------------------- */
.page {
page-break-after: always;
}
</style>
</head>
<body>
<h3 id="install-mavros">Install MAVROS</h3>
<pre class="hljs"><code><div>sudo apt-get install ros-kinetic-mavros ros-kinetic-mavros-extras
</div></code></pre>
<ul>
<li>GCS — Ground Control Station</li>
<li>FCU — Flight Control Unit (pixhawk)</li>
<li>OBC — OnBoard Computer (your odroid or raspberry)</li>
</ul>
<h2 id="run-sitl-and-ros">Run SITL and ROS</h2>
<h3 id="terminal-1-sitl">Terminal 1 (sitl)</h3>
<pre class="hljs"><code><div>sim_vehicle.py -v ArduCopter --console
</div></code></pre>
<h3 id="terminal-2-launch">Terminal 2 (launch)</h3>
<pre class="hljs"><code><div>udp://[bind_host][:port]@[remote_host[:port]][/?ids=sysid,compid]
roslaunch mavros apm.launch fcu_url:=udp://127.0.0.1:14551@14555
</div></code></pre>
<h3 id="rqt-terminal-3">rqt (Terminal 3)</h3>
<p>Use GUI to control (call service, monitor and pub topics)</p>
<pre class="hljs"><code><div>rqt
</div></code></pre>
<ul>
<li>plugins -> robots tools -> runtime monitor</li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBnI45WKq3Pp2vHQ0z9T0iP9ZBmUVHSYm2CY6ZFqfeq11hIAAb0CCyoiDLx42H41rCmZZU9-29MJozSxnBruJQGLpfADSHLP54ZTnP_X5-3oFqWxdPG3gxhm7Gt-x4PdLKNs33-Ljm8Ts/s1600/2018-09-03-01-03-35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjBnI45WKq3Pp2vHQ0z9T0iP9ZBmUVHSYm2CY6ZFqfeq11hIAAb0CCyoiDLx42H41rCmZZU9-29MJozSxnBruJQGLpfADSHLP54ZTnP_X5-3oFqWxdPG3gxhm7Gt-x4PdLKNs33-Ljm8Ts/s400/2018-09-03-01-03-35.png" width="400" height="162" data-original-width="698" data-original-height="282" /></a></div></p>
<h4 id="set-mode">Set mode</h4>
<ul>
<li>plugins -> Services -> Service Caller</li>
<li>from service combo select <code>/mavros/set_mode</code></li>
</ul>
<p><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs7Uy5ajz3aeRQd4Y6u7U7zA9-iA14UESj72z94CMwTMwIjKlpyi66QCbm163HHlLpt47J8Qk1qM4io1A8MNrzChA8JcDTdLfsHmnbMpCKUFqJ5rjWJf1ah5JxBrQ_6KwFMuSjuRWWlYA/s1600/2018-09-03-00-44-39.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgs7Uy5ajz3aeRQd4Y6u7U7zA9-iA14UESj72z94CMwTMwIjKlpyi66QCbm163HHlLpt47J8Qk1qM4io1A8MNrzChA8JcDTdLfsHmnbMpCKUFqJ5rjWJf1ah5JxBrQ_6KwFMuSjuRWWlYA/s400/2018-09-03-00-44-39.png" width="400" height="225" data-original-width="1600" data-original-height="900" /></a></div></p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://github.com/mavlink/mavros/blob/master/mavros/README.md">mavros</a></li>
<li><a href="http://ardupilot.org/dev/docs/ros-sitl.html">ROS with SITL</a></li>
</ul>
</body>Unknownnoreply@blogger.com0