@robutun 这个我没有遇到过,不太清楚
ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision

Posts made by weijiz
-
伽利略导航SDK发布
2019.3.30
伽利略导航系统是一款用于机器人定位与导航的超高性价比的模块化的解决方案。它采用多种传感器融合定位,具有精度高,稳定性好 的特点。和传统的定位方式相比,伽利略导航系统不需要用户铺设轨道,完全图形化的人机交互界面,使用方便,维护成本低。
为了方便客户使用和开发相关的导航功能,我们发布了伽利略导航SDK。通过伽利略导航SDK用户可以在没有ROS基础的情况下使用伽利略导航系统。使用方法简单快捷,同时我们也配套了详细的文档说明,进一步降低开发难度。
伽利略导航系统SDK的相关文档可以查看这里
-
如何恢复小强中被修改的软件包
在使用小强的过程中可能会对小强中的相关软件进行修改。很容易出现修改后小强不能正常工作的情况。下面介绍如何恢复小强的相关软件。
小强的相关软件都是通过git进行代码管理的。任何对代码的更改都是有迹可循的,也是可以恢复的。下面以startup软件包为例进行说明。
假设我们修改了小强的startup软件包,导致有些启动项没有正常运行。如何查看我们做了哪些修改呢?可以通过下面的指令
# 进入startup 软件包所在目录 roscd startup # 查看我们进行了哪些修改 git diff
如果有修改我们可以看到下面的输出
从这里我们可以看出usb_cam包的launch文件被注释掉了。这样小强就不会开机自动启动摄像头了。
如果我们想要恢复到原来的文件状态,可以执行下面的指令。
# 进入startup 软件包 roscd startup # 撤销所有更改 git stash
可以看到刚才的更改已经被撤销了。
如果你不习惯使用命令行进行操作,我们也可以使用vscode进行操作。
通过vscode打开startup软件包。
点击左侧第三个按钮,进入代码管理界面
可以看到这里列出了startup.launch文件被修改
想要查看修改内容,只需要点击对应的文件即可。可以看到usb_cam那一行被标记修改过了。
如果想要撤销修改可以右键单击文件,在弹出的菜单中选择撤销更改。
以上是代码的恢复。但是仅恢复代码有时小强还是无法正常工作。对于startup软件包来说,要需要重新注册启动项后,更改才能生效。对于启动项的注册可以查看小强用户手册。
对于需要编译的代码,代码需要在重新编译后才会生效。比如
xqserial_server
在进行更改后需要# 进入小强工作空间 cd ~/Documents/ros # 编译xqserial_server软件包 catkin_make -DCATKIN_WHITELIST_PACKAGES="xqserial_server"
编译成功后
sudo service startup restart
这样更改才能生效。对于进行了很多修改,而以上恢复办法仍无法让小强正常工作时,那只能用重装系统大法了
-
C++在使用C库时malloc和new导致的错误
在用C++编程的时候对于Linux的系统相关操作,比如socket的处理。经常要调用系统的程序库。Linux系统的库主要用c编写。一般情况下C++使用起来并没有什么问题。但是也有一些需要注意的地方。
在使用C的库时开辟内存要用malloc,一般C++程序用new。比如下面就是我遇到的一个例子
#ifdef WIN32 send(sockfd, request.c_str(), request.size(), 0); #else write(sockfd, request.c_str(), request.size()); #endif char *buf = (char *)malloc(1024 * 1024); int offset = 0; int rc; #ifdef WIN32 while ((rc = recv(sockfd, buf + offset, 1024, 0))) #else while ((rc = read(sockfd, buf + offset, 1024))) #endif { offset += rc; } #ifdef WIN32 closesocket(sockfd); #else close(sockfd); #endif buf[offset] = 0; std::string res = std::string(buf); auto find_res = res.find("\r\n\r\n"); auto body = res.substr(res.find("\r\n\r\n") + 4, res.size()); free(buf);
这里的buf如果用
char *buf = new char[1024 * 1024]
定义buf,然后用delete[] buf
去释放内存。编译时并不会有问题,但是在Linux上运行时会出segment fault错误。在Windows上运行是正常的。
用上面的方式定义buf和回收buf就没有问题。 -
RE: 使用xiaoqiang_track进行人体跟随和追踪
@huapiaoxiang21 首先要确保成功编译了消息文件。看看在
devel/lib/python2.7/dist-packages/xiaoqiang_track/msg
文件夹是否有对应文件。然后要确保环境变量是对的。有没有source工作空间的setup.bash。 -
RE: 如何移植ROS程序到Android
@gongyue666 可以参照这个教程。
简单说就是利用java的工具生成c++的头文件,然后把自己的方法添加到对应的实现里面。
这是我自己移植程序的 jni wrapper -
如何移植ROS程序到Android
在Android上运行ROS程序一般使用rosjava-android。但是也可以直接利用NDK编译成so文件移植到Android上。当然移植过程也并不简单。 下面是一个简单的例子。
安装cmake(>3.14)
新版本的cmake增加了对Android cross compile的支持,所以我们要安装新版本的cmake。
wget -q https://github.com/Kitware/CMake/releases/download/v3.14.0-rc4/cmake-3.14.0-rc4.tar.gz tar -xzf cmake-3.14.0-rc4.tar.gz cd cmake-3.14.0-rc4/ env CC=$(which clang) CXX=$(which clang++) ./bootstrap --prefix=/usr --parallel=4 make sudo make install cd ..
安装clang
新版本的NDK默认使用clang进行编译。所以我们需要安装clang。clang的安装方式可以参照这里
安装NDK
wget -q https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip unzip -qq android-ndk-r18b-linux-x86_64.zip export NDK_ROOT=$(pwd)/android-ndk-r18b
设置cmake toolchain
git clone https://github.com/BluewhaleRobot/rostoolchain export TOOLCHAIN_ROOT=$(pwd)/rostoolchain
安装Boost-android
git clone https://github.com/moritz-wundke/Boost-for-Android mkdir boost_libs cd Boost-for-Android ./build-android.sh --boost=1.68.0 --prefix=$(pwd)/../boost_libs $NDK_ROOT cd .. #set up boost export INSTALL_PREFIX=/opt/ros/arm sudo mkdir -p $INSTALL_PREFIX/include sudo mkdir -p $INSTALL_PREFIX/lib sudo cp -rf boost_libs/armeabi-v7a/include/boost-1_68/boost $INSTALL_PREFIX/include/ sudo cp boost_libs/armeabi-v7a/lib/*.a $INSTALL_PREFIX/lib/
设置ROS workspace
mkdir -p arm/src cd arm/src git clone https://github.com/ros/catkin --depth=1 git clone https://github.com/ros/common_msgs --depth=1 git clone https://github.com/ros/gencpp --depth=1 git clone https://github.com/jsk-ros-pkg/geneus --depth=1 git clone https://github.com/ros/genlisp --depth=1 git clone https://github.com/ros/genmsg --depth=1 git clone https://github.com/RethinkRobotics-opensource/gennodejs --depth=1 git clone https://github.com/ros/genpy --depth=1 git clone https://github.com/ros/message_generation --depth=1 git clone https://github.com/ros/message_runtime --depth=1 git clone https://github.com/BluewhaleRobot/ros_comm --depth=1 git clone https://github.com/ros/ros_comm_msgs --depth=1 git clone https://github.com/BluewhaleRobot/rosconsole --depth=1 git clone https://github.com/BluewhaleRobot/roscpp_core --depth=1 git clone https://github.com/ros/std_msgs --depth=1
编译工作空间
cd .. ./src/catkin/bin/catkin_make -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain-arm.cmake -DCATKIN_WHITELIST_PACKAGES="" -DBUILD_SHARED_LIBS=OFF sudo cp -rf devel/lib/*.a $INSTALL_PREFIX/lib/ sudo cp -rf devel/lib/pkgconfig $INSTALL_PREFIX/lib/ export PKG_CONFIG_PATH=$INSTALL_PREFIX/lib/pkgconfig
编译你自己的代码
现在把你的代码放置到此工作空间内,然后像之前编译工作空间一样。
./src/catkin/bin/catkin_make -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain-arm.cmake -DCATKIN_WHITELIST_PACKAGES="" -DBUILD_SHARED_LIBS=OFF
编译出so文件或.a文件之后,利用JNI写一个包装程序,然后通过java调用。这样就可以在Android app里面使用了。
-
如何利用cmake移植程序到Android
很多c++和c程序都使用cmake去管理程序依赖和编译程序。新版本的cmake已经支持 cross compile 程序到android平台。我们可以利用ndk和cmake很方便的移植程序。下面是一个移植的例子。
安装clang
因为新版本的ndk已经默认使用clang进行编译了
安装方式参照这里
安装新版本的cmake(>3.14)
wget -q https://github.com/Kitware/CMake/releases/download/v3.14.0-rc4/cmake-3.14.0-rc4.tar.gz tar -xzf cmake-3.14.0-rc4.tar.gz cd cmake-3.14.0-rc4/ env CC=$(which clang) CXX=$(which clang++) ./bootstrap --prefix=/usr --parallel=4 make sudo make install
下载NDK
cd .. wget -q https://dl.google.com/android/repository/android-ndk-r18b-linux-x86_64.zip unzip -qq android-ndk-r18b-linux-x86_64.zip export NDK_ROOT=$(pwd)/android-ndk-r18b
创建toolchain文件
toolchain文件是cmake用来设置编译工具链的文件。配置好此文件就可以让cmake cross compile android 程序了。
toolchain.cmake文件内容如下
# 设置编译Android set(CMAKE_SYSTEM_NAME Android) # 设置Android NDK 路径 set(CMAKE_ANDROID_NDK $ENV{NDK_ROOT}) # 设置 Android ABI set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a) # 设置target api版本 set(CMAKE_SYSTEM_VERSION 19) # 设置cmake寻找路径,自己随便创建一个文件夹, 依赖的相关库文件也要放在这里 set(CMAKE_FIND_ROOT_PATH /opt/arm) # 设置cmake搜寻文件的方式,防止使用系统中的其他不相干文件 set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
编译自己的程序
和正常编译方式差别不大,只要加上toolchain参数就可以了
mkdir build cd build cmake -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_ROOT/toolchain.cmake -DCMAKE_INSTALL_PREFIX=$INSTALL_PREFIX ..
TOOLCHAIN_ROOT是你的toolchain文件路径, INSTALL_PREFIX是之前设置的CMAKE_FIND_ROOT_PATH。这样就可以cross compile Android程序了。
-
RE: 使用xiaoqiang_track进行人体跟随和追踪
@robot0612 检查你的devel/include文件夹内是否有body_pose/Body_Pose.h
-
RE: 在小强上使用body_pose进行人体识别
@robot0612 里面的一个依赖库新版本不支持python2.7了。需要下载旧版本
pip install munkres==1.0.12
-
RE: 在小强上使用body_pose进行人体识别
@robot0612 感觉你的python环境可能有问题,错误的代码语法是python3的,但是却出现在python2.7的路径里面