摘要:将拍摄到的图片拷贝到目录下,注意不要出现命名,其中为自然数字,否则图片有可能被覆盖。打开终端,执行讲图片名统一编号为自然数序列。
mkdir -p ~/catkin_ws/srccd ~/catkin_ws/catkin_makemkdir ORB-SLAM2
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrcsource ~/.bashrc
sudo apt-get install libblas-dev liblapack-dev
编译Pangolin:
sudo apt-get install libglew-devsudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-devsudo apt-get install libpython2.7-devsudo apt-get install build-essentialcd ~/catkin_ws/ORB-SLAM2git clone https://github.com/stevenlovegrove/Pangolin.gitcd Pangolinmkdir buildcd buildcmake -DCPP11_NO_BOOST = 1..make
下载Eigen 注意是3.2.10版本:
mkdir buildcd buildcmake ..makesudo make install
安装OpenCV:
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-devmkdir releasecd releasecmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..makesudo make install
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/(user)/catkin_ws/ORB-SLAM2/Examples/ROS
cd ORB_SLAM2chmod +x build_ros.sh./build_ros.sh
error:uspleep()函数未定义的错误->解决方法,在报错代码文件加:
#include #include #include
cd catkin_ws/srcgit clone https://github.com/bosch-ros-pkg/usb_cam.gitcd ..catkin_makemkdir buildcd buildcmake ..make查找替换摄像头:ls /dev/video*cd /home/pan/catkin_ws/src/usb_camcd launchgedit usb_cam-test.launch
修改/dev/videoX 为支持摄像头
8. 运行指令:
roscoreroslaunch usb_cam usb_cam-test.launchrosrun ORB_SLAM2 Mono /home/(user)/catkin_ws/src/ORB_SLAM2/Vocabulary/ORBvoc.txt /home/(user)/catkin_ws/src/ORB_SLAM2/Examples/Monocular/MyCam.yaml
Android 客户端源代码:Github
修改build的地址
PC接收侧代码:Github
保证客户端和PC在同一局域网下,修改客户端连接ip地址
sudo apt-get install ros-melodic-imu-tools或者sudo apt-get install ros-kinetic-imu-tools
指令打开RIVZ后选择接收Add - By topic - 添加 imu将topic选为/android/imu且在 Global Options -> Fix Frame 中 将 map 改为 imu。
参考操作:
调试rviz,并解决问题“For frame [laser]: Fixed Frame [map] does not exist”!
sudo apt-get install ros-indigo-image-view ros-indigo-rqt-image-view ros-indigo-image-transport-plugins 或者sudo apt-get install ros-melodic-image-view ros-melodic-rqt-image-view ros-melodic-image-transport-plugins
在Terminal 先启动roscore 在通过rostopic list 查看已有的订阅主题
默认的image传输为compressed,因此需要做将image转换为raw格式
cd到Android_Camera-IMU-master文件夹下找android_cam-imu.launch文件,修改其中的订阅节点如下
Terminal中输入指令:roslaunch android_cam-imu.launch
Add Topic -> image -> Image Topic 设置为/camera/image_raw
github源码
相机标定模块使用说明
1. 在DASH中输入cheese打开相机,从各个角度拍摄标定棋盘10~20张,一定要变换相机姿态,减少误差。
2. 将ccheese拍摄到的图片拷贝到camera_calibration目录下,注意不要出现(.jpg命名,其中为自然数字,否则图片有可能被覆盖)。
3. 打开终端,执行./rename.sh讲图片名统一编号为自然数序列。
4. 在终端执行./camera_calibration boardWidth boardHeight squareSize frameNumber
boardWidth :棋盘横向角点数目 如:9
boardHeight :棋盘纵向角点数目 如:6
squareSize :棋盘中每个格子(要求是正方形)的实际边长,单位:mm 如:25
frameNumber:要计算的图片数量 如:17
参考文章:知乎
在android_tutorial_camera_imu 工程下增加Talker和Listener Class:
Listener.java监听rmytopic
package org.ros.android.android_tutorial_camera_imu;//import org.apache.commons.logging.Log;import android.util.Log;import org.ros.message.MessageListener;import org.ros.namespace.GraphName;import org.ros.node.AbstractNodeMain;import org.ros.node.ConnectedNode;import org.ros.node.NodeMain;import org.ros.node.topic.Subscriber;public class Listener extends AbstractNodeMain { @Override public GraphName getDefaultNodeName() { return GraphName.of("rosjava_tutorial_pubsub/listener"); } public void onStart(ConnectedNode connectedNode) { //final Log log = connectedNode.getLog(); Log.d("listener", "Node Log "+ connectedNode.getLog() + " "); Subscriber<std_msgs.String> subscriber = connectedNode.newSubscriber("rmytopic", std_msgs.String._TYPE); subscriber.addMessageListener(new MessageListener<std_msgs.String>() { @Override public void onNewMessage(std_msgs.String message) { Log.d("listener", "I heard: /"" + message.getData() + "/""); } }); }}
Talker.java发送至chatter
package org.ros.android.android_tutorial_camera_imu;import org.ros.concurrent.CancellableLoop;import org.ros.namespace.GraphName;import org.ros.node.AbstractNodeMain;import org.ros.node.ConnectedNode;import org.ros.node.NodeMain;import org.ros.node.topic.Publisher;/** * A simple {@link Publisher} {@link NodeMain}. * * @author damonkohler@google.com (Damon Kohler) */public class Talker extends AbstractNodeMain { @Override public GraphName getDefaultNodeName() { return GraphName.of("rosjava_tutorial_pubsub/talker"); } @Override public void onStart(final ConnectedNode connectedNode) { final Publisher<std_msgs.String> publisher = connectedNode.newPublisher("chatter", std_msgs.String._TYPE); // This CancellableLoop will be canceled automatically when the node shuts // down. connectedNode.executeCancellableLoop(new CancellableLoop() { @Override protected void setup() { } @Override public void loop() throws InterruptedException { std_msgs.String str = publisher.newMessage(); str.setData("Hello ROS from client"); publisher.publish(str); Thread.sleep(25000); } }); }}
修改MainActivity.java
/* * Copyright (C) 2011 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */package org.ros.android.android_tutorial_camera_imu;import android.Manifest;import android.annotation.TargetApi;import android.content.Context;import android.content.pm.PackageManager;import android.hardware.Camera;import android.hardware.SensorManager;import android.location.LocationManager;import android.os.Build;import android.os.Bundle;import android.support.v4.app.ActivityCompat;import android.util.Log;import android.view.MotionEvent;import android.view.Window;import android.view.WindowManager;import android.widget.Toast;import org.ros.address.InetAddressFactory;import org.ros.android.RosActivity;import org.ros.android.view.camera.RosCameraPreviewView;import org.ros.node.NodeConfiguration;import org.ros.node.NodeMainExecutor;import java.util.List;import org.ros.android.MessageCallable;import org.ros.android.view.RosTextView;import org.ros.android.android_tutorial_camera_imu.Talker;/** * @author ethan.rublee@gmail.com (Ethan Rublee) * @author damonkohler@google.com (Damon Kohler) * @author huaibovip@gmail.com (Charles) */public class MainActivity extends RosActivity { private int cameraId = 0; private RosCameraPreviewView rosCameraPreviewView; private NavSatFixPublisher fix_pub; private ImuPublisher imu_pub; private NodeMainExecutor nodeMainExecutor; private LocationManager mLocationManager; private SensorManager mSensorManager; private RosTextView<std_msgs.String> rosTextView; private Talker talker; private Listener listener; public MainActivity() { super("ROS", "Camera & Imu"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_main); rosCameraPreviewView = findViewById(R.id.ros_camera_preview_view); mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); mSensorManager = (SensorManager) this.getSystemService(SENSOR_SERVICE); rosTextView = (RosTextView<std_msgs.String>)findViewById(R.id.text); rosTextView.setTopicName("rmytopic"); rosTextView.setMessageType(std_msgs.String._TYPE); rosTextView.setMessageToStringCallable(new MessageCallable<String, std_msgs.String>() { @Override public String call(std_msgs.String message) { return message.getData(); } }); } @Override public boolean onTouchEvent(MotionEvent event) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { if (event.getAction() == MotionEvent.ACTION_UP) { int numberOfCameras = Camera.getNumberOfCameras(); final Toast toast; if (numberOfCameras > 1) { cameraId = (cameraId + 1) % numberOfCameras; rosCameraPreviewView.releaseCamera(); rosCameraPreviewView.setCamera(getCamera()); toast = Toast.makeText(this, "Switching cameras.", Toast.LENGTH_SHORT); } else { toast = Toast.makeText(this, "No alternative cameras to switch to.", Toast.LENGTH_SHORT); } runOnUiThread(new Runnable() { @Override public void run() { toast.show(); } }); } } return true; } @Override @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1) //API = 15 protected void init(NodeMainExecutor nodeMainExecutor) { this.nodeMainExecutor = nodeMainExecutor; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String[] PERMISSIONS = {"", "", "", ""}; PERMISSIONS[0] = Manifest.permission.ACCESS_FINE_LOCATION; PERMISSIONS[1] = Manifest.permission.CAMERA; PERMISSIONS[2] = Manifest.permission.READ_EXTERNAL_STORAGE; PERMISSIONS[3] = Manifest.permission.WRITE_EXTERNAL_STORAGE; ActivityCompat.requestPermissions(this, PERMISSIONS, 0); }else { NodeConfiguration nodeConfiguration1 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress()); nodeConfiguration1.setMasterUri(getMasterUri()); nodeConfiguration1.setNodeName("android_sensors_driver_nav_sat_fix"); this.fix_pub = new NavSatFixPublisher(mLocationManager); nodeMainExecutor.execute(this.fix_pub, nodeConfiguration1); rosCameraPreviewView.setCamera(getCamera()); NodeConfiguration nodeConfiguration2 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress()); nodeConfiguration2.setMasterUri(getMasterUri()); nodeConfiguration2.setNodeName("android_sensors_driver_camera"); nodeMainExecutor.execute(this.rosCameraPreviewView, nodeConfiguration2); } NodeConfiguration nodeConfiguration3 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress()); nodeConfiguration3.setMasterUri(getMasterUri()); nodeConfiguration3.setNodeName("android_sensors_driver_imu"); this.imu_pub = new ImuPublisher(mSensorManager); nodeMainExecutor.execute(this.imu_pub, nodeConfiguration3); talker = new Talker(); listener = new Listener(); NodeConfiguration nodeConfiguration4 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress()); nodeConfiguration4.setMasterUri(getMasterUri()); NodeConfiguration nodeConfiguration5 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback().getHostAddress()); nodeConfiguration5.setMasterUri(getMasterUri()); nodeMainExecutor.execute(talker, nodeConfiguration4); nodeMainExecutor.execute(listener,nodeConfiguration5); nodeMainExecutor.execute(rosTextView,nodeConfiguration4); } private void executeGPS() { NodeConfiguration nodeConfiguration1 = NodeConfiguration.newPublic(InetAddressFactory.newNonLoopback(
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/121645.html
摘要:在拥有更好的扩展性的同时,还能给对数据进行压缩,减少的体积。然而,的要求必须使用标准的,并不是很方便换成。如果将转成放在特定的中的话,则又失去了的类型信息。使用时,只要即可,完全符合的推荐使用方式。 Background 做 ROS 相关开发的,应该都知道 ros msg 有个非常大的槽点: ros msg 扩展性较差,即如果 msg 的字段发生变化,则程序前后版本不兼容 因此,goo...
摘要:针对这点,人们将机器人需要的各类软件要素总结在一起,开发出了专门用于机器人的中间件。的开端要追溯到世纪初于斯坦福大学进行的一个个人机器人项目。 机器人的结构 其中还包括一些机器人特有的构成要素,例如驱动器和用于驱动的电机驱动等。控制的内容也并非单纯的信号控制,还需要实现运转控制乃至图像识别...
摘要:当打开一个新的终端时,环境变量会自动生效。安装如果你采用我这种方式安装,那么会在安装时自动安装了。需要转换一个规则,以致于能够可靠的检测到工厂快速芯片。规则安装问题答疑 注意这里只给出我实验的安装方式,具体所有的安装方式请查看:http://wiki.ros.org/turtlebot... 1、安装 sudo apt-get install ros-indigo-turtlebot ...
摘要:引言已经发布,相信众多容器江湖的伙伴们正魔拳擦准备好好体验一番。为了更好的体验的完整特性,我们选取了测试比较严格的运行环境。 引言 Rancher v1.2已经发布,相信众多容器江湖的伙伴们正魔拳擦准备好好体验一番。由于Docker能够落地的操作系统众多,各种Docker版本不同的Graph driver,所以通常大版本的第一个release都会在兼容性上有一些小问题。为了更好的体验R...
(转载请注明作者和出处:https://yangningbocn.github.io 未经允许请勿用于商业用途) 背景 笔记本型号:联想Y500 CPU : Intel® Core™ i7-3630QM CPU @ 2.40GHz × 8 内存:7.7 GiB 显卡:GeForce GT 750M/PCIe/SSE2 系统版本:ubuntu 14.04 LTS 64bit 软件:...
阅读 1385·2021-11-04 16:11
阅读 1832·2021-09-30 09:47
阅读 3075·2021-09-09 11:33
阅读 1424·2019-08-30 15:54
阅读 501·2019-08-30 15:44
阅读 3017·2019-08-30 15:43
阅读 2343·2019-08-30 13:06
阅读 1591·2019-08-29 17:00