<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Topics tagged with ros]]></title><description><![CDATA[A list of topics that have been tagged with ros]]></description><link>http://community.bwbot.org/tags/ros</link><generator>RSS for Node</generator><lastBuildDate>Tue, 12 May 2026 22:14:55 GMT</lastBuildDate><atom:link href="http://community.bwbot.org/tags/ros.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Sep 2025 07:59:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[ROS1节点在VSCode外的终端窗口中运行的时候，文件夹下没有生成结果文件。]]></title><description><![CDATA[<p dir="auto">这是一个非常典型的 <strong>文件路径问题</strong> 或 <strong>环境变量/工作目录差异</strong> 导致的问题。你提到：</p>

在 <strong>VSCode 中运行节点</strong> 时，文件正常生成。
在 <strong>外部终端运行节点</strong> 时，<strong>不生成文件</strong>，但节点运行正常，终端输出正常。
重启虚拟机可以临时解决。

<p dir="auto">这说明问题不是代码本身，而是 <strong>运行环境差异</strong>，尤其是 <strong>当前工作目录（Current Working Directory, CWD）</strong> 和 <strong>路径配置</strong>。</p>

✅ 一、可能原因分析
1. 当前工作目录（CWD）不同
<p dir="auto">在 VSCode 中运行 ROS 节点时，它默认使用你打开的 <strong>工作区根目录</strong> 或 launch.json 中指定的 cwd。</p>
<p dir="auto">而在外部终端中运行节点时，<strong>当前工作目录</strong> 可能是你当前所在的目录（比如 ~、/home/user、/tmp 等），而不是你的 ROS 工作空间目录（如 ~/catkin_ws）。</p>
<p dir="auto">如果你的代码中使用了相对路径（如 "output.txt"），那么生成的文件会出现在当前工作目录下。</p>

2. 文件权限问题（尤其是虚拟机共享文件夹）
<p dir="auto">在虚拟机中（如 VirtualBox + 共享文件夹 / VMware 共享文件夹），某些路径可能因为权限限制导致无法写入文件。</p>

VSCode 可能是以用户权限运行的，有写权限。
外部终端可能因为 shell 环境或权限设置不同，导致无法写入目标路径。


3. ROS 参数服务器路径配置错误
<p dir="auto">如果你的代码是通过 ROS 参数服务器获取路径（如 ~output_dir），那么：</p>

VSCode 中可能加载了正确的参数配置。
外部终端运行时没有加载参数文件（.yaml），导致路径为空或错误。


✅ 二、排查方法
方法 1：打印当前工作目录
<p dir="auto">在你的 ROS 节点中加入以下代码（C++ 示例）：</p>
#include 
#include 
#include 

char cwd[PATH_MAX];
if (getcwd(cwd, sizeof(cwd)) != NULL) {
    ROS_INFO("Current working directory: %s", cwd);
}

<p dir="auto">Python 示例：</p>
import os
rospy.loginfo(f"Current working directory: {os.getcwd()}")

<p dir="auto">这样你就可以看到在不同环境中运行时的工作目录是否一致。</p>

方法 2：检查文件写入路径是否绝对路径
<p dir="auto">如果你的代码中写文件使用的是相对路径：</p>
std::ofstream file("output.txt");

<p dir="auto">那文件会写入到当前工作目录中。</p>
<p dir="auto">建议改成绝对路径或根据 ROS 参数配置路径：</p>
std::string output_path;
nh.getParam("~output_path", output_path);  // 从参数服务器获取路径
std::ofstream file(output_path + "/output.txt");

<p dir="auto">或者使用 ros::package::getPath() 获取包路径：</p>
std::string package_path = ros::package::getPath("your_package_name");
std::ofstream file(package_path + "/output/output.txt");


方法 3：检查文件是否真的没有生成
<p dir="auto">在终端中运行：</p>
find ~/ -name "output.txt" 2&gt;/dev/null

<p dir="auto">或在虚拟机中搜索整个系统：</p>
sudo find / -name "output.txt"

<p dir="auto">确认文件是否真的没有生成，还是只是不在你预期的位置。</p>

方法 4：检查权限
<p dir="auto">如果你的路径是共享文件夹（如 VirtualBox 共享文件夹），尝试在终端中运行：</p>
ls -ld /path/to/output

<p dir="auto">确保当前用户有写权限。你也可以尝试手动创建一个测试文件：</p>
touch /path/to/output/test.txt

<p dir="auto">如果失败，说明权限有问题。</p>

✅ 三、解决方案建议
✅ 推荐做法：使用 ROS 参数配置路径
<p dir="auto">修改代码，使用参数服务器配置输出路径：</p>
# config/params.yaml
output_path: "/home/user/catkin_ws/src/your_package/output"

<p dir="auto">启动时加载参数：</p>
roslaunch your_package your_launch_file.launch --params-file config/params.yaml


✅ 推荐做法：在终端中指定工作目录
<p dir="auto">你可以手动指定工作目录运行节点：</p>
cd ~/catkin_ws
source devel/setup.bash
rosrun your_package your_node

<p dir="auto">或者使用 --cwd（仅限 rosrun 支持）：</p>
rosrun --prefix 'cd /home/user/catkin_ws &amp;&amp;' your_package your_node


✅ 推荐做法：在 launch 文件中设置工作目录
<p dir="auto">如果你用 roslaunch，可以在 .launch 文件中指定工作目录：</p>

  
    
  



✅ 四、总结



原因
解决方法




当前工作目录不同
使用 getcwd() 打印路径，统一运行目录


相对路径写入
改为绝对路径或使用 ros::package::getPath()


参数配置缺失
使用参数服务器统一配置路径


权限问题
检查路径权限，避免共享文件夹限制


虚拟机共享路径问题
尝试复制文件到本地路径测试




🧪 附加建议
<p dir="auto">你可以写一个最小可复现问题的测试程序，例如：</p>
#include 
#include 

int main() {
    std::ofstream file("test.txt");
    if (file.is_open()) {
        file &lt;&lt; "Test content\n";
        file.close();
        std::cout &lt;&lt; "File written successfully.\n";
    } else {
        std::cerr &lt;&lt; "Failed to open file.\n";
    }
    return 0;
}

<p dir="auto">然后分别在 VSCode 和外部终端运行，看是否能生成文件，这样可以快速定位是否是路径问题。</p>

<p dir="auto">如果你愿意贴出部分代码片段，我可以帮你具体分析路径写入逻辑。</p>
]]></description><link>http://community.bwbot.org/topic/16670/ros1节点在vscode外的终端窗口中运行的时候-文件夹下没有生成结果文件</link><guid isPermaLink="true">http://community.bwbot.org/topic/16670/ros1节点在vscode外的终端窗口中运行的时候-文件夹下没有生成结果文件</guid><dc:creator><![CDATA[小助理]]></dc:creator><pubDate>Sun, 07 Sep 2025 07:59:24 GMT</pubDate></item><item><title><![CDATA[ROS连接雷达出现以下错误]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="http://community.bwbot.org/uid/1648">@jerry</a> 可能雷达坏了，rplidar经常会遇到这种情况</p>
]]></description><link>http://community.bwbot.org/topic/16578/ros连接雷达出现以下错误</link><guid isPermaLink="true">http://community.bwbot.org/topic/16578/ros连接雷达出现以下错误</guid><dc:creator><![CDATA[weijiz]]></dc:creator><pubDate>Thu, 13 Apr 2023 12:17:29 GMT</pubDate></item><item><title><![CDATA[GPS在ROS中的测试和使用]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="http://community.bwbot.org/uid/1119">@叫我小冬枣</a> 可能你的设备路径不对吧</p>
]]></description><link>http://community.bwbot.org/topic/718/gps在ros中的测试和使用</link><guid isPermaLink="true">http://community.bwbot.org/topic/718/gps在ros中的测试和使用</guid><dc:creator><![CDATA[weijiz]]></dc:creator><pubDate>Mon, 22 Feb 2021 01:35:53 GMT</pubDate></item><item><title><![CDATA[在Android中使用ROS]]></title><description><![CDATA[<p dir="auto">为什么编译总是这个错误？是依赖错了吗？</p>
Caused by: org.gradle.api.resources.ResourceException: Could not get resource 'https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle'.
	at org.gradle.internal.resource.ResourceExceptions.failure(ResourceExceptions.java:74)
	at org.gradle.internal.resource.ResourceExceptions.getFailed(ResourceExceptions.java:57)
	at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceAccessor.resolve(DefaultExternalResourceAccessor.java:67)
	at org.gradle.api.internal.artifacts.repositories.resolver.DefaultExternalResourceAccessor.resolveUri(DefaultExternalResourceAccessor.java:47)
	at org.gradle.internal.resource.transfer.DefaultUriTextResourceLoader.loadUri(DefaultUriTextResourceLoader.java:43)
	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.applyScript(DefaultObjectConfigurationAction.java:103)
	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.access$000(DefaultObjectConfigurationAction.java:38)
	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction$1.run(DefaultObjectConfigurationAction.java:68)
	at org.gradle.api.internal.plugins.DefaultObjectConfigurationAction.execute(DefaultObjectConfigurationAction.java:143)
	at org.gradle.api.internal.project.AbstractPluginAware.apply(AbstractPluginAware.java:46)
	at org.gradle.api.internal.project.ProjectScript.apply(ProjectScript.java:34)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
	at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
	at org.gradle.internal.metaobject.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:479)
	at org.gradle.internal.metaobject.BeanDynamicObject.tryInvokeMethod(BeanDynamicObject.java:191)
	at org.gradle.groovy.scripts.BasicScript$ScriptDynamicObject.tryInvokeMethod(BasicScript.java:130)
	at org.gradle.internal.metaobject.ConfigureDelegate.invokeMethod(ConfigureDelegate.java:78)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeOnDelegationObjects(ClosureMetaClass.java:430)
	at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:369)
	at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
	at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:69)

Caused by: org.gradle.internal.resource.transport.http.HttpRequestException: Could not HEAD 'https://github.com/rosjava/android_core/raw/kinetic/buildscript.gradle'.
	at org.gradle.internal.resource.transport.http.HttpClientHelper.performRequest(HttpClientHelper.java:96)
	at org.gradle.internal.resource.transport.http.HttpClientHelper.performRawHead(HttpClientHelper.java:72)
	at org.gradle.internal.resource.transport.http.HttpClientHelper.performHead(HttpClientHelper.java:76)
	at org.gradle.internal.resource.transport.http.HttpResourceAccessor.getMetaData(HttpResourceAccessor.java:65)
	at org.gradle.internal.resource.transfer.DefaultExternalResourceConnector.getMetaData(DefaultExternalResourceConnector.java:63)
	at org.gradle.internal.resource.transfer.AccessorBackedExternalResource.getMetaData(AccessorBackedExternalResource.java:201)
	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$1.call(BuildOperationFiringExternalResourceDecorator.java:61)
	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator$1.call(BuildOperationFiringExternalResourceDecorator.java:58)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:350)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:340)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
	at org.gradle.internal.progress.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:120)
	at org.gradle.internal.resource.BuildOperationFiringExternalResourceDecorator.getMetaData(BuildOperationFiringExternalResourceDecorator.java:58)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:102)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor$1.create(DefaultCacheAwareExternalResourceAccessor.java:82)
	at org.gradle.cache.internal.ProducerGuard$AdaptiveProducerGuard.guardByKey(ProducerGuard.java:97)
	at org.gradle.internal.resource.transfer.DefaultCacheAwareExternalResourceAccessor.getResource(DefaultCacheAwareExternalResourceAccessor.java:82)

]]></description><link>http://community.bwbot.org/topic/627/在android中使用ros</link><guid isPermaLink="true">http://community.bwbot.org/topic/627/在android中使用ros</guid><dc:creator><![CDATA[几何木偶]]></dc:creator><pubDate>Wed, 22 Jan 2020 01:33:34 GMT</pubDate></item><item><title><![CDATA[sophus编译错误的解决方法]]></title><description><![CDATA[<pre><code>error: optional in namespace Sophus does not name a template type
</code></pre>
<p dir="auto">在使用sophus库的时候可能会遇到如上的错误。这可能是由于系统中安装了ros自带的sohups库的原因。 运行</p>
<pre><code class="language-bash">sudo apt-get remove ros-kinetic-sophus
</code></pre>
<p dir="auto">卸载系统自带的sophus库，再次编译即可。</p>
]]></description><link>http://community.bwbot.org/topic/519/sophus编译错误的解决方法</link><guid isPermaLink="true">http://community.bwbot.org/topic/519/sophus编译错误的解决方法</guid><dc:creator><![CDATA[weijiz]]></dc:creator><pubDate>Sat, 11 Aug 2018 07:12:11 GMT</pubDate></item><item><title><![CDATA[ZED摄像头的使用]]></title><description><![CDATA[<h2>1. 安装CUDA</h2>
<h3>1.1 禁用原有的驱动</h3>
<p dir="auto">如果你之前安装了Nvidia的开源驱动，即通过apt-get 安装的驱动。则需要先把开源驱动禁用掉。</p>
<pre><code class="language-bash">lsmod | grep nouveau #检测Nouveau是否开启，有输出则开启，无输出则为开启
#若Nouveau开启，执行以下命令
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf #创建blacklist文件
# 在创建的文件中输入以下内容关闭掉Nouveau
blacklist nouveau
options nouveau modeset=0
# 更新list，使得更改生效
sudo update-initramfs -u
</code></pre>
<p dir="auto">然后再<a href="https://developer.nvidia.com/cuda-downloads" target="_blank" rel="noopener noreferrer">官网下载</a>CUDA安装文件，推荐下载.run的文件</p>
<h3>1.2 进入文本模式，禁用图像显示</h3>
<p dir="auto">下载完成后同时按下 <code>Ctrl + Alt + F1</code>进入文本模式，按照提示登入用户名密码。<br />
然后执行下面指令关闭图形界面</p>
<pre><code class="language-bash">sudo service lightdm stop
</code></pre>
<h3>1.3 安装CUDA</h3>
<p dir="auto">执行</p>
<pre><code class="language-bash">sudo sh cuda_9.2.148_396.37_linux.run
</code></pre>
<p dir="auto">根据安装过程的提示进行安装，一般默认就可以了。推荐安装上自带的驱动，防止自己安装驱动版本对不上。</p>
<h3>1.4 设置环境变量</h3>
<p dir="auto">安装完成之后会提示设置环境变量，根据提示设置就可以了<br />
在.bashrc文件中添加下面的内容</p>
<pre><code class="language-bash">export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64
</code></pre>
<h3>1.5 测试一下</h3>
<pre><code class="language-bash">bash
nvcc -V
</code></pre>
<p dir="auto">正常应该会显示出CUDA的版本信息。</p>
<h2>2. 下载安装SDK</h2>
<p dir="auto">从<a href="https://www.stereolabs.com/developers/release/2.5" target="_blank" rel="noopener noreferrer">官方下载</a>SDK</p>
<p dir="auto">执行</p>
<pre><code>chmod +x zed_sdk_file
./zed_sdk_file
</code></pre>
<p dir="auto">按照提示安装就可以了</p>
<h2>3. 运行测试程序</h2>
<pre><code class="language-bash">cd /usr/local/zed/tools
./ZED\ Depth\ Viewer
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1533970371191-8c4f1c9f-66dd-450a-a49d-ada780db1a7a-image-resized.png" alt="0_1533970368567_8c4f1c9f-66dd-450a-a49d-ada780db1a7a-image.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">一切正常应该可以看到下图所示的画面。</p>
<h2>4. 安装ROS驱动</h2>
<pre><code>cd [to your workspace]/src
git clone https://github.com/stereolabs/zed-ros-wrapper
cd ..
catkin_make -DCATKIN_WHITELIST_PACKAGES="zed_wrapper"
</code></pre>
<h2>5. 测试ROS驱动</h2>
<p dir="auto">等待编译完成</p>
<pre><code class="language-bash">roslaunch zed_display_rviz display.launch
</code></pre>
<p dir="auto">正常即可看到下面的显示了</p>
<p dir="auto"><img src="/assets/uploads/files/1533970971031-f7eb760c-d085-4bc6-95ce-c466db23e23e-image-resized.png" alt="0_1533970968419_f7eb760c-d085-4bc6-95ce-c466db23e23e-image.png" class=" img-responsive img-markdown" /></p>
]]></description><link>http://community.bwbot.org/topic/518/zed摄像头的使用</link><guid isPermaLink="true">http://community.bwbot.org/topic/518/zed摄像头的使用</guid><dc:creator><![CDATA[weijiz]]></dc:creator><pubDate>Sat, 11 Aug 2018 07:04:20 GMT</pubDate></item><item><title><![CDATA[AI Planning 简介]]></title><description><![CDATA[<p dir="auto">谢谢分享，最近正好在研究这方面的东西，太给力了</p>
]]></description><link>http://community.bwbot.org/topic/494/ai-planning-简介</link><guid isPermaLink="true">http://community.bwbot.org/topic/494/ai-planning-简介</guid><dc:creator><![CDATA[bot]]></dc:creator><pubDate>Sat, 30 Jun 2018 08:49:00 GMT</pubDate></item><item><title><![CDATA[在小强中使用语音识别和语音合成]]></title><description><![CDATA[<p dir="auto">语音合成测试，运行成功，但是一直处于time.sleep中，出不来了，怎么办？</p>
]]></description><link>http://community.bwbot.org/topic/492/在小强中使用语音识别和语音合成</link><guid isPermaLink="true">http://community.bwbot.org/topic/492/在小强中使用语音识别和语音合成</guid><dc:creator><![CDATA[lpa]]></dc:creator><pubDate>Fri, 16 Jul 2021 08:50:34 GMT</pubDate></item><item><title><![CDATA[ros 发布软件包时提示git-bloom-patch trim错误]]></title><description><![CDATA[<p dir="auto">在发布软件包的时候遇到了下面的问题</p>
<pre><code>[git-bloom-patch trim]: You are trying to set the trim sub directory to xiaoqiang_navigation/xiaoqiang_navigation, but it is already set to xiaoqiang_navigation.
 [git-bloom-patch trim]: Changing the sud directory is not advised. If you are sure you want to do this, use '--force'
</code></pre>
<p dir="auto">这是由于软件包的路径发生了改变，但是release软件源内仍然存储着以前的包结构。<br />
比如原来xioqiang_navigation是一个软件包，我把多个包放到了这个包内，结果包的路径就成了xiaoqiang_navigation/xiaoqiang_navigation。</p>
<p dir="auto">解决方法就是直接修改release 软件源内的记录。比如发布到kinetic版本<br />
找到patchs/release/kinetic/xiaoqiang_navigation分支，打开patches.conf文件<br />
将trim中包的路径改成当前的路径。<br />
比如我的情况就是</p>
<pre><code>[patches]
	trim = xiaoqiang_freenect/xiaoqiang_freenect
	base = 4ecb3b9
	trimbase = a145a72
	parent = upstream
	previous = 38bc215
</code></pre>
<p dir="auto">改动完成后提交就可以了。<br />
再次执行发布指令就不会有错误了。</p>
]]></description><link>http://community.bwbot.org/topic/487/ros-发布软件包时提示git-bloom-patch-trim错误</link><guid isPermaLink="true">http://community.bwbot.org/topic/487/ros-发布软件包时提示git-bloom-patch-trim错误</guid><dc:creator><![CDATA[weijiz]]></dc:creator><pubDate>Sat, 09 Jun 2018 13:40:19 GMT</pubDate></item><item><title><![CDATA[在hikey 970上安装debian并运行ROS]]></title><description><![CDATA[<p dir="auto">经过长时间的等待hikey 970的debian系统终于发布了。</p>
<p dir="auto"><a href="https://www.bwbot.org/s/uxszxd" target="_blank" rel="noopener noreferrer">系统下载地址</a></p>
<p dir="auto">首先保证机器能够正常运行Android,基础固件没有问题。下载完成后解压文件</p>
<h3>设置机器开关</h3>
<p dir="auto">刷系统前需要让板子开机后进入fastboot模式，这个可以通过设置板子上的开关完成。把开关状态设置成On Off  On Off。然后上电启动。</p>
<h3>刷入Debian 系统</h3>
<h4>在Linux下刷入Debian系统</h4>
<p dir="auto">如果你是Linux系统则按照此处的指令刷入Debian系统</p>
<pre><code class="language-bash">#进入解压后的文件夹
fastboot flash xloader sec_xloader.img
fastboot flash ptable prm_ptable.img
fastboot flash fastboot l-loader.bin
fastboot flash fip fip.bin
fastboot flash boot boot2grub.uefi.img
fastboot flash system rootfs.sparse.img
# 注意刷入系统文件的过程需要很多时间，需要耐心等待
# 刷入分区表
wget http://www.bwbot.org/s/uhzKfx -O '64gtoendprm_ptable.img'
fastboot flash ptable 64gtoendprm_ptable.img
</code></pre>
<h4>在Windows 下刷人Debian系统</h4>
<p dir="auto">如果你是在Windows环境下刷入Debian系统则执行下面的指令</p>
<pre><code class="language-bash">#进入解压后的文件夹
.\update_Hikey970.bat
</code></pre>
<p dir="auto">整个刷入时间要很久，需要耐心等待<br />
刷入完成后再次刷入分区表<br />
<a href="https://www.bwbot.org/s/uhzKfx" target="_blank" rel="noopener noreferrer">分区表下载地址</a><br />
下载完成后放入当前文件夹执行下面的指令</p>
<pre><code class="language-bash">fastboot.exe flash ptable 64gtoendprm_ptable.img
</code></pre>
<h3>启动系统</h3>
<p dir="auto">拔掉板子的电源，将开关拨至 On Off Off Off 状态，然后上电。等待板子启动完成。给板子插上网线，这时候可以看到网口的灯在闪烁。说明板子已经正常启动了。</p>
<p dir="auto">在路由器上查找板子的ip</p>
<p dir="auto"><img src="/assets/uploads/files/1528443161888-2018-06-08-15-32-12-%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png" alt="0_1528443161588_2018-06-08 15-32-12 的屏幕截图.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">正常情况下应该能够看到如图所示的设备。然后通过ssh 连接就可以了。用户名和密码都是hoperun</p>
<pre><code class="language-bash">ssh hoperun@xxx.xxx.xxx.xxx
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1528443320953-2018-06-08-15-34-58-%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE-resized.png" alt="0_1528443320667_2018-06-08 15-34-58 的屏幕截图.png" class=" img-responsive img-markdown" /></p>
<h3>安装常用工具</h3>
<pre><code>sudo apt-get install bash-completion #增加自动补全功能
sudo apt-get install htop #查看系统资源使用情况工具
/bin/bash -c "$(curl -sL https://git.io/vokNn)" #安装apt-fast，安装软件更快
</code></pre>
<h3>安装ROS</h3>
<p dir="auto">ROS的安装过程和一般的ROS版本安装是一样的，但是奇怪的是我的源里面没有找到kinetic版本。下面安装的是melodic版本。可能是这个版本的Debian只支持melodic。</p>
<h4>添加ROS软件源</h4>
<pre><code class="language-bash">sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" &gt; /etc/apt/sources.list.d/ros-latest.list'
</code></pre>
<h4>添加key</h4>
<pre><code class="language-bash">sudo apt-fast update
sudo apt-fast install dirmngr
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
</code></pre>
<h4>开始安装</h4>
<pre><code class="language-bash">sudo apt-fast update
sudo apt-fast install ros-melodic-desktop-full -y
</code></pre>
<h4>配置环境</h4>
<pre><code class="language-bash">sudo rosdep init
rosdep update
echo "source /opt/ros/melodic/setup.bash" &gt;&gt; ~/.bashrc
source ~/.bashrc
</code></pre>
<h4>安装编译软件包依赖</h4>
<pre><code class="language-bash">sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential
</code></pre>
<p dir="auto">测试一下</p>
<p dir="auto"><img src="/assets/uploads/files/1528444150542-2018-06-08-15-48-51-%E7%9A%84%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE-resized.png" alt="0_1528444150090_2018-06-08 15-48-51 的屏幕截图.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">成功了！</p>
]]></description><link>http://community.bwbot.org/topic/483/在hikey-970上安装debian并运行ros</link><guid isPermaLink="true">http://community.bwbot.org/topic/483/在hikey-970上安装debian并运行ros</guid><dc:creator><![CDATA[weijiz]]></dc:creator><pubDate>Fri, 08 Jun 2018 07:49:36 GMT</pubDate></item><item><title><![CDATA[hikey 970 开发板刷基础固件和Android系统]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="http://community.bwbot.org/uid/603">@how0723</a> 普通的USB摄像头就可以</p>
]]></description><link>http://community.bwbot.org/topic/462/hikey-970-开发板刷基础固件和android系统</link><guid isPermaLink="true">http://community.bwbot.org/topic/462/hikey-970-开发板刷基础固件和android系统</guid><dc:creator><![CDATA[weijiz]]></dc:creator><pubDate>Wed, 13 Jun 2018 01:00:20 GMT</pubDate></item><item><title><![CDATA[ROS运行python脚本报错: No module named srv]]></title><description><![CDATA[<p dir="auto">调试一个python脚本时，突然报错</p>
<pre><code>ImportError: No module named srv under tf2_msgs
</code></pre>
<p dir="auto">机器已经安装了ros jade完整版，在/opt/ros/jade/lib/python2.7/dist-packages/tf2_msgs目录下也有srv目录，应该没问题的。<br />
google一番，发现有人反应是python包名字问题(http://www.aichengxu.com/view/75748)，但tf2_msgs是官方包，自然不存在这个问题。<br />
回想一下今天对系统的改动，白天升级了一下jade版本的tf2包，但因为bullet依赖问题，升级到一半就放弃了（这个依赖问题可以参考http://answers.ros.org/question/220676/how-to-install-bullet-on-indigo-in-ubuntu/）。<br />
重新catkin_make 了下ros工作目录，然后仔细翻看了一下ros工作目录的devel目录，发现/home/xiaoqiang/Documents/ros/devel/lib/python2.7/dist-packages目录下竟然还有tf2_msgs文件夹，但里面没有srv目录。<br />
所以找到问题根源了</p>
<pre><code>一个ROS python包即使从工作目录删除了，catkin_make命令也不会删除之前残留在devel目录下的文件夹
rosrun 和 roslaunch 运行节点程序时，优先查找用户工作目录，导致尝试从一个残留文件夹加载运行文件，这就导致了开头的问题
</code></pre>
]]></description><link>http://community.bwbot.org/topic/91/ros运行python脚本报错-no-module-named-srv</link><guid isPermaLink="true">http://community.bwbot.org/topic/91/ros运行python脚本报错-no-module-named-srv</guid><dc:creator><![CDATA[xiaoqiang]]></dc:creator><pubDate>Wed, 27 Jul 2016 13:31:50 GMT</pubDate></item><item><title><![CDATA[为ROS navigation功能包添加自定义的全局路径规划器(Global Path Planner)]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="http://community.bwbot.org/uid/1225">@Lee1004</a> dwa是通过makeplan这个service由move_base传给它的，正因为如此，所以这个发布就可有可无，只是一个显示用途</p>
]]></description><link>http://community.bwbot.org/topic/43/为ros-navigation功能包添加自定义的全局路径规划器-global-path-planner</link><guid isPermaLink="true">http://community.bwbot.org/topic/43/为ros-navigation功能包添加自定义的全局路径规划器-global-path-planner</guid><dc:creator><![CDATA[xiaoqiang]]></dc:creator><pubDate>Fri, 27 Nov 2020 01:35:04 GMT</pubDate></item><item><title><![CDATA[分享一些ROS教程文档]]></title><description><![CDATA[<p dir="auto">共享在<a href="http://pan.baidu.com/s/1boF91Pt" target="_blank" rel="noopener noreferrer">百度云</a>里，请自行下载查看<br />
http://pan.baidu.com/s/1boF91Pt</p>
]]></description><link>http://community.bwbot.org/topic/28/分享一些ros教程文档</link><guid isPermaLink="true">http://community.bwbot.org/topic/28/分享一些ros教程文档</guid><dc:creator><![CDATA[frank]]></dc:creator><pubDate>Fri, 27 May 2016 08:10:30 GMT</pubDate></item><item><title><![CDATA[利用ros实时显示测试数据]]></title><description><![CDATA[<p dir="auto">ros内部非常适合程序间进行通信，其内部又包含了非常方便的图标工具。下面就是一个用ros提供的工具做实时的舵机角度显示的例子。<br />
先看看效果吧</p>
<p dir="auto"><img src="/uploads/files/1447227069345-screenshot-from-2015-11-11-15-30-37.png" alt="0_1447227049969_Screenshot from 2015-11-11 15:30:37.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">左侧是程序的log输出右侧是画出的角度图。</p>
<p dir="auto">程序的整体结构也是比较简单的。由手机端发送舵机控制指令到装有ros系统的电脑。电脑收到数据后，从数据中取出各个舵机的角度，同时创建一个叫做monitor的topic。然后把角度信息通过这个topic发送出去。rqt_plot监听这个topic就可以画出各个舵机的实时的角度图了。</p>
<p dir="auto">ok，开始写这个ros的package吧。</p>
<p dir="auto">首先，创建一个ros workspace</p>
<pre><code>cd ~/Documents
mkdir -p ros/workspace/src
cd ros/workspace/src
catkin_init_workspace
cd ..
catkin_make
source devel/setup.sh
</code></pre>
<p dir="auto">这时会发现目录结构如下图</p>
<p dir="auto"><img src="/uploads/files/1447228330853-screenshot-from-2015-11-11-15-51-47.png" alt="0_1447228312789_Screenshot from 2015-11-11 15:51:47.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">接着创建一个ros package</p>
<pre><code>catkin_create_pkg statusmonitor std_msgs rospy roscpp
roscd statusmonitor
</code></pre>
<p dir="auto"><img src="/uploads/files/1447228942780-screenshot-from-2015-11-11-16-01-58.png" alt="0_1447228924693_Screenshot from 2015-11-11 16:01:58.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">现在的目录结构应该如上图所示</p>
<p dir="auto">src文件夹内创建monitor.py内容如下</p>
<pre><code>#!/usr/bin/env python
# license removed for brevity
import rospy
import socket
from statusmonitor.msg import *
import cmds as Commands
import threading

PACKAGE_HEADER = [205, 235, 215]
dataCache = []

def getDataFromReq(req):
    pass

def unpackReq(req):
    global dataCache
    res = []
    packageList = splitReq(req)
    # process the first package
    completeData = dataCache + packageList[0]
    packageList.remove(packageList[0])
    packageList =  splitReq(completeData) + packageList

    for count in range(0, len(packageList)):
        if len(packageList[count]) != 0 and len(packageList[count]) == packageList[count][0] + 1:
            res.append(packageList[count][1:])
    lastOne = packageList[-1:][0] # the last one
    if len(lastOne) == 0 or len(lastOne) != lastOne[0] + 1:
        dataCache = lastOne
    return res


def findPackageHeader(req):
    if len(req) &lt; 3:
        return -1
    for count in range(0, len(req) - 2):
        if req[count] == PACKAGE_HEADER[0] and req[count + 1] == PACKAGE_HEADER[1] and req[count + 2] == PACKAGE_HEADER[2]:
            return count
    return -1

def splitReq(req):
    res = []
    startIndex = 0
    newIndex = 0
    while True:
        newIndex = findPackageHeader(req[startIndex:])
        if newIndex == -1:
            break
        res.append(req[startIndex: startIndex + newIndex])
        startIndex = newIndex + 3 + startIndex
    res.append(req[startIndex:])
    return res

def parseData(cmds):
    res = None
    for count in range(0, len(cmds)):
        if chr(cmds[count][0]) == Commands.CMD_STEER_SET:
            if cmds[count][1] == 1:
                res = Steer1()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub1.publish(res)
            if cmds[count][1] == 2:
                res = steer2()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub2.publish(res)
            if cmds[count][1] == 3:
                res = steer3()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub3.publish(res)
            if cmds[count][1] == 4:
                res = steer4()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub4.publish(res)
            if cmds[count][1] == 5:
                res = steer5()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub5.publish(res)
            if cmds[count][1] == 6:
                res = steer6()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub6.publish(res)
            if cmds[count][1] == 7:
                res = steer7()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub7.publish(res)
            if cmds[count][1] == 8:
                res = steer8()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub8.publish(res)
            if cmds[count][1] == 9:
                res = steer9()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub9.publish(res)
            if cmds[count][1] == 10:
                res = steer10()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub10.publish(res)
            if cmds[count][1] == 11:
                res = steer11()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub11.publish(res)
            if cmds[count][1] == 12:
                res = steer12()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub12.publish(res)
            if cmds[count][1] == 13:
                res = steer13()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub13.publish(res)
            if cmds[count][1] == 14:
                res = steer14()
                res.angle = cmds[count][2] * 0xff + cmds[count][3]
                pub14.publish(res)
    return res

class handleSocket(threading.Thread):

    def __init__(self, conn, addr):
        threading.Thread.__init__(self)
        self.conn = conn
        self.addr = addr

    def run(self):
        print 'Connection address:', addr
        while 1:
            data = conn.recv(BUFFER_SIZE)
            if not data: break
            conn.send(data)  # echo
            rospy.loginfo(data)
            dataList = []
            for c in data:
                dataList.append(ord(c))
            parseData(unpackReq(dataList))

        conn.close()




if __name__ == '__main__':

    pub1 = rospy.Publisher('monitor_steer1', Steer1, queue_size=10)
    pub2 = rospy.Publisher('monitor_steer2', steer2, queue_size=10)
    pub3 = rospy.Publisher('monitor_steer3', steer3, queue_size=10)
    pub4 = rospy.Publisher('monitor_steer4', steer4, queue_size=10)
    pub5 = rospy.Publisher('monitor_steer5', steer5, queue_size=10)
    pub6 = rospy.Publisher('monitor_steer6', steer6, queue_size=10)
    pub7 = rospy.Publisher('monitor_steer7', steer7, queue_size=10)
    pub8 = rospy.Publisher('monitor_steer8', steer8, queue_size=10)
    pub9 = rospy.Publisher('monitor_steer9', steer9, queue_size=10)
    pub10 = rospy.Publisher('monitor_steer10', steer10, queue_size=10)
    pub11 = rospy.Publisher('monitor_steer11', steer11, queue_size=10)
    pub12 = rospy.Publisher('monitor_steer12', steer12, queue_size=10)
    pub13 = rospy.Publisher('monitor_steer13', steer13, queue_size=10)
    pub14 = rospy.Publisher('monitor_steer14', steer14, queue_size=10)

    rospy.init_node('talker', anonymous=True)


    TCP_IP = '0.0.0.0'
    TCP_PORT = 50000
    BUFFER_SIZE = 1024  # Normally 1024, but we want fast response


    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((TCP_IP, TCP_PORT))
    s.listen(1)
    while 1:
        conn, addr = s.accept()
        handleSocket(conn, addr).start()
</code></pre>
<p dir="auto">从程序入口开始说明。首先创建了一系列的ros的publisher，这个可以用来向topic发送信息。然后初始化ros节点。<br />
接着创建一个socket，监听发送由机器人控制端发送来的指令数据。收到数据后就把数据包解开，提取处各个舵机的角度，通过最开始创建的publisher发送出去。</p>
<p dir="auto">主程序就是这样，下面开始创建ros message。在src文件夹内创建msg文件夹，并在其中创建Steer1.msg到Steer14.msg，这些文件的内容都是一样的</p>
<pre><code>float32 angle

float32 res
</code></pre>
<p dir="auto">msg文件就是表明msg的格式的文件。之后编译包的时候这些文件会被编译成c++文件和python文件。<br />
接着就是修改makefile，因为msg是需要编译的嘛。</p>
<pre><code>find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
</code></pre>
<p dir="auto">第一步就是在find_package中添加message_generation<br />
然后添加msg文件</p>
<pre><code>add_message_files(
   FILES
   Steer1.msg
   Steer2.msg
   Steer3.msg
   Steer4.msg
   Steer5.msg
   Steer6.msg
   Steer7.msg
   Steer8.msg
   Steer9.msg
   Steer10.msg
   Steer11.msg
   Steer12.msg
   Steer13.msg
  )
</code></pre>
<p dir="auto">在generate msg 添加 std_msg</p>
<pre><code>generate_messages(
   DEPENDENCIES
  std_msgs
)
</code></pre>
<p dir="auto">在依赖中加入message_runtime</p>
<pre><code>catkin_package(
# INCLUDE_DIRS include
LIBRARIES statusmonitor
CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
</code></pre>
<p dir="auto">到这里就应该差不多了。</p>
<p dir="auto">开始编译</p>
<pre><code>cd ~/Documents
cd ros/workspace/src
catkin_make
</code></pre>
<p dir="auto">如果输出如下图就说明编译正确<br />
<img src="/uploads/files/1447377321665-screenshot-from-2015-11-13-09-14-46.png" alt="0_1447377293843_Screenshot from 2015-11-13 09:14:46.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">下一步就是开始运行了</p>
<pre><code>source devel/setup.sh
rosrun statusmonitor monitor.py
</code></pre>
<p dir="auto">这样当收到控制端发送来的数据时就会如下显示</p>
<p dir="auto"><img src="/uploads/files/1447377492578-screenshot-from-2015-11-13-09-17-36.png" alt="0_1447377469742_Screenshot from 2015-11-13 09:17:36.png" class=" img-responsive img-markdown" /></p>
<p dir="auto">在一个新终端中启动rqt_plot,然后选择想要观察的topic就行了</p>
<p dir="auto"><img src="/uploads/files/1447377642498-screenshot-from-2015-11-13-09-20-09.png" alt="0_1447377619619_Screenshot from 2015-11-13 09:20:09.png" class=" img-responsive img-markdown" /></p>
]]></description><link>http://community.bwbot.org/topic/7/利用ros实时显示测试数据</link><guid isPermaLink="true">http://community.bwbot.org/topic/7/利用ros实时显示测试数据</guid><dc:creator><![CDATA[randoms]]></dc:creator><pubDate>Wed, 11 Nov 2015 08:24:26 GMT</pubDate></item></channel></rss>