Start a new topic

iOS POI base AR does not work on iOS 8.3

iOS POI base AR does not work on iOS 8.3

I am trying to integrate AR poi view with Wikitude in my app. As html I used a file from the example `4_PointOfInterest_4_SelectingPois`. It should render a few point around my location. It does it, but all points stay in the same position all the time, although I changed my phone position. I do not have any errors in the console. How can I fix it ?

On the attached photo you can see current result. The pois positon stays the same on phone position change. 

I develop on iPhone 5s iOS 8.3

My code
  #import "ViewController.h"
    #import <WikitudeSDK/WikitudeSDK.h>
    #import "PureLayout.h"
    @interface ViewController () <WTArchitectViewDelegate>
    @property (nonatomic, strong) WTArchitectView *architectView;
    @property (nonatomic, weak) WTNavigation *architectWorldNavigation;
    @property (nonatomic, weak) IBOutlet UIView *augmentedViewContainer;
    @end
    @implementation ViewController
    - (void)viewDidLoad {
        ;
        NSError *deviceNotSupportedError = nil;
        if ( ) { // 1
            self.architectView = ;
            self.architectView.delegate = self;
            ;
            self.architectWorldNavigation = ;
            ;
            ;
            ;
            ;
        } else {
            NSLog(@"device is not supported - reason: %@", );
        }
    }
    - (void)startRunning {
        if ( ! ) {
            ;
        }}
    - (void)pauseRunning {
        if ( ) {
            ;
        }}
    - (void)dealloc {
        ;
    }
    #pragma mark - Delegation
    #pragma mark WTArchitectViewDelegate
    - (void)architectView:(WTArchitectView *)architectView didFinishLoadArchitectWorldNavigation:(WTNavigation *)navigation {
        NSLog(@"didFinishLoadArchitectWorldNavigation");
    }
    - (void)architectView:(WTArchitectView *)architectView didFailToLoadArchitectWorldNavigation:(WTNavigation *)navigation withError:(NSError *)error {
        NSLog(@"Architect World from URL '%@' could not be loaded. Reason: %@", navigation.originalURL, );
    }
    #pragma mark WTArchitectViewDebugDelegate
    - (void)architectView:(WTArchitectView *)architectView didFailCaptureScreenWithError:(NSError *)error {
        NSLog(@"didFailCaptureScreenWithError %@",error);
    }
    - (void)architectView:(WTArchitectView *)architectView didEncounterInternalError:(NSError *)error {
        NSLog(@"WTArchitectView encountered an internal error '%@'", );
    }
You can implement the onLocationChanged in JavaScript to check if you received a location update:

AR.context.onLocationChanged = function(latitude, longitude, altitude, accuracy){
  //now, add custom functionality to build the AR scene based on the location
}

On iOS, you can inject the location by setting the setUseInjectedLocation function to true and inject it with the function injectLocationWithLatitude.
Don't forget that you really have to walk some meters that you notice a location change.

Hope that helps,
Christian

PS. please do not ask the same quetion in multiple forums next time.
I added an alert in location change and the allert appears on location or device position change, but still all of my pois stays in the same positon on device position change. How I can fix it ? 

P.S I do not want to fake my location. On my iOS device the SDK complitly does not work for geo location base AR.

My js
// implementation of AR-Experience (aka "World")
var World = {
// you may request new data from server periodically, however: in this sample data is only requested once
isRequestingData: false,
// true once data was fetched
initiallyLoadedData: false,
// different POI-Marker assets
markerDrawable_idle: null,
markerDrawable_selected: null,
markerDrawable_directionIndicator: null,
// list of AR.GeoObjects that are currently shown in the scene / World
markerList: ,
// The last selected marker
currentMarker: null,
// called to inject new POI data
loadPoisFromJsonData: function loadPoisFromJsonDataFn(poiData) {
// empty list of visible markers
World.markerList = ;
// Start loading marker assets:
// Create an AR.ImageResource for the marker idle-image
World.markerDrawable_idle = new AR.ImageResource("assets/marker_idle.png");
// Create an AR.ImageResource for the marker selected-image
World.markerDrawable_selected = new AR.ImageResource("assets/marker_selected.png");
// Create an AR.ImageResource referencing the image that should be displayed for a direction indicator.
World.markerDrawable_directionIndicator = new AR.ImageResource("assets/indi.png");
// loop through POI-information and create an AR.GeoObject (=Marker) per POI
for (var currentPlaceNr = 0; currentPlaceNr < poiData.length; currentPlaceNr++) {
var singlePoi = {
"id": poiData.id,
"latitude": parseFloat(poiData.latitude),
"longitude": parseFloat(poiData.longitude),
"altitude": parseFloat(poiData.altitude),
"title": poiData.name,
"description": poiData.description
};
/*
To be able to deselect a marker while the user taps on the empty screen,
the World object holds an array that contains each marker.
*/

World.markerList.push(new Marker(singlePoi));
}
World.updateStatusMessage(currentPlaceNr + ' places loaded');
},
// updates status message shon in small "i"-button aligned bottom center
updateStatusMessage: function updateStatusMessageFn(message, isWarning) {
var themeToUse = isWarning ? "e" : "c";
var iconToUse = isWarning ? "alert" : "info";
$("#status-message").html(message);
$("#popupInfoButton").buttonMarkup({
theme: themeToUse
});
$("#popupInfoButton").buttonMarkup({
icon: iconToUse
});
},
// location updates, fired every time you call architectView.setLocation() in native environment
locationChanged: function locationChangedFn(lat, lon, alt, acc) {
        alert('Location received');
/*
The custom function World.onLocationChanged checks with the flag World.initiallyLoadedData if the function was already called. With the first call of World.onLocationChanged an object that contains geo information will be created which will be later used to create a marker using the World.loadPoisFromJsonData function.
*/

if (!World.initiallyLoadedData) {
/*
requestDataFromLocal with the geo information as parameters (latitude, longitude) creates different poi data to a random location in the user's vicinity.
*/
World.requestDataFromLocal(lat, lon);
World.initiallyLoadedData = true;
}
},
// fired when user pressed maker in cam
onMarkerSelected: function onMarkerSelectedFn(marker) {
// deselect previous marker
if (World.currentMarker) {
if (World.currentMarker.poiData.id == marker.poiData.id) {
return;
}
World.currentMarker.setDeselected(World.currentMarker);
}
// highlight current one
marker.setSelected(marker);
World.currentMarker = marker;
},
// screen was clicked but no geo-object was hit
onScreenClick: function onScreenClickFn() {
if (World.currentMarker) {
World.currentMarker.setDeselected(World.currentMarker);
}
},
// request POI data
requestDataFromLocal: function requestDataFromLocalFn(centerPointLatitude, centerPointLongitude) {
var poisToCreate = 20;
var poiData = ;
for (var i = 0; i < poisToCreate; i++) {
poiData.push({
"id": (i + 1),
"longitude": (centerPointLongitude + (Math.random() / 5 - 0.1)),
"latitude": (centerPointLatitude + (Math.random() / 5 - 0.1)),
"description": ("This is the description of POI#" + (i + 1)),
// use this value to ignore altitude information in general - marker will always be on user-level
"altitude": AR.CONST.UNKNOWN_ALTITUDE,
"name": ("POI#" + (i + 1))
});
}
World.loadPoisFromJsonData(poiData);
}
};
/*
Set a custom function where location changes are forwarded to. There is also a possibility to set AR.context.onLocationChanged to null. In this case the function will not be called anymore and no further location updates will be received.
*/
AR.context.onLocationChanged = World.locationChanged;
/*
To detect clicks where no drawable was hit set a custom function on AR.context.onScreenClick where the currently selected marker is deselected.
*/
AR.context.onScreenClick = World.onScreenClick;
I mentioned the functionality to inject the location to point out that you could control the location update from your native code, independent if you use a fake location or a real location.

Log the location values and compare them with your current location. What is your position and how far is the distance when you change youre position? Keep in mind that you will not receive accurate values if you move indoors.

Christian

The location is about 5 m from my real location, so its not bad. But even with bad location, the accelerometer is working in any condition, so if I change the position of the phone the pois should move. i.e. I have iPhone pointed in north direction and then if I change it to south the pois should move, right now they do not. The issue I described above also happens in official samples, so there is definitely something wrong.
Alight, I guess I misunderstood the issue.  So, the problem is not the location, but the fact that the POIs are stuck on the screen and do not move when you turn, right? That sounds like there is a problem with the compass. Did you calibrate the compass? Are you close to any materials that could influence the compass?  Does the compass work properly in the maps application? Did you test the application on a different iOS device?

Correct, on location change I see the change in poi position, but the pois stays in the same position on device rotate or gyro change. The compass works good on maps or any other app.

Edit: If the value from the compass is invalid still there should be a change in poi position on iPhone screen.

I'll try to reproduce the issue. Is is possible for you to test the example on a different iOS device in the meantime?

I do not have any diffrent devices. I did some more tests, on compass/accelometer change onlocationchange is not executed, only on location change.

This is because the onLocationChanged-trigger fires only when the latitude, longitude, or altitude changes. You do not yet have access to the position of the device in the 3D space via our API, such as accelerometer or gyroscope values.

For this issue I have seprated project. You can see full code here https://github.com/ltomaszewski/WikitudeTEST.git

Any updates?

Hi,

 

I seem to have the same problem. I built the "Plugin Samples" app and used:

 

iPhone 6 - Firmware 8.2

Cordova 3.8.0 (via npm and phonegap)

Wikitude Plugin with release date 09.03.15

 

I tried the 4.3 and 6.2 examples (and others) in the Samples App. Regardless of how I move the phone (outside) or tilt or pan, the POIs always stay frozen.

 

I also just tried the Test App from Lukasz, and also there, the POIs stay frozen for me. Even after adding your suggested changes.

 

Regards

Roman

 

Interestingly enough, I tried on a different iPhone 6, and both, the Samples App and the Test from Lukasz work just fine!

Somehow my iPhone 6 has a compass problem. Though the compass works fine in the compass app and in other apps, it seems to always point North with my Wikitude tests. Very strange, I will try to reset/update this bad iPhone next.

Regards
Roman
Login or Signup to post a comment