Testing 3.5 on my Solo - She flies!

Bad Logging: I do have the LOG_xx parameters set as you described. The error Bad Logging still apears.
Could it be be a typo? LOG_BITMASK = 131070 value is not explained in the Arducopter wiki - there is a value of 131071 though.

My GoPro4B with V3 firmware powers on and off w/o problems with RC3

I can confirm the occasionally limping gimbal. It appears the roll motor has less torque with RC3 compared to the 1.3.1/1.5.3 Solo firmware.

Interesting. My GoPro is on v4, so I was expecting it to not power on at least. Good to know the GoPro v3 doesn’t have that problem. Do you have Log_Disarmed enabled or disabled?

Matt, LOG_DISARMED is set to 0 (Disabled)

Great chat in the dev call yesterday! It was awesome to see so much interest in this building up. This will keep Solo alive for a long time!

I was chatting with Kelly (of Solex fame) last night and he’s definitely very eager to integrate. Having a simple UI for firmware updates will absolutely skyrocket the user base for both AC and Solex. I’ve documented a step by step detailed process to update the conventional way using MP. It’s two pages long and looks scary to people new to Arducopter. It also leaves it wide open for people who stop reading directions after step 3 to randomly push buttons in MP and hose the whole thing. A few taps in Solex solves all of that.

I’m not really familiar with what goes into compiling a solo specific version with default parameters baked in. It sounded like there’s a few ways to go about it. Some more tiresome than others. I was thinking there could be another option. The Solex app can read/write parameters on the pixhawk already. So, why not use that ability? Solex can just pull the parameter file from github tools/frame_params. With that method, parameters can be pulled down, compared, updated, etc at any time. If someone updates the parameters on GitHub, Solex could even see the new update, notify the user, and update the users parameters. And no need for custom AC versions.

really great you are testing this so much!

regarding the gimbal… would be worth comparing the solo branch with master and just seeing if there are any parameters being sent or anything…

hopefully thats a simple one.

Good idea! Where/how to begin on that?

It’s listed as the solo gimbal, or solo mount…

Grep for Solo in the ArduCopter code

Something is definitely up with the gimbal.

  • On numerous occasions now, the gimbal will not activate on power up. Reading through the CPP files, I believe this is what the code calls “idle”? All 3 axes are powered down. Only way to rectify is to power off the solo and power it back on. This also results in the GoPo locking up. But I have to wonder… if the gimbal making the GoPro lock up? Or is the GoPro lock up pissing the gimbal off?

  • When sitting on the ground, perfectly level, just not doing anything, the yaw axis gets really noisy, like the gain is too high or something. It’s not out balance or anything. Nothing is in the way or touching it inside. There is a lot of yaw calculation going on in the solo gimbal CPP files. Could the change in Ardupilot PID gains between 3.3 and 3.4 be effecting the way it’s calculating yaw stuff for the gimbal? I think the copter PIDs were switched from radians to centidegrees. Perhaps the gimbals is still looking at them as radians? See this video.
    https://www.youtube.com/watch?v=OQeRfbwlN2M

  • Occasionally in flight, it just goes limp. I believe it’s all axes but at the very least it’s the roll and yaw axes. I haven’t found a circumstance that causes it. But I would imagine is related the above two issues. I hasn’t done it the last several test flights.

I experience such whining noise of the gimbal motors on one of my Solos too, independent of the FW used. No difference between 1.3.1, 1.5.3, and now Master. I guess its rather an issue with the particular gimbal, not the FW.
If you have a spare gimbal, test it again to eventually rule out any issues with the gimbal.

1 Like

I just completed my first testflights with 3.5RC3.
Overall I am extremely pleased with the performance. I used EKF2 settings and fixed some other glitches in the params file such as the Bad Logging error.

What I tested today:

  • flight modes Loiter, Stabilize, AltHold, Drift, Guided, Land: zero issues, super stable with the PIDs I used
  • RTK GPS: worked flawlessy in RTK Fix and float mode as well in non RTK mode
  • Return to Home (RTH): worked flawless (I tested it under different cirumstances)
  • Rewind (long pause press) flawless in Smartshots and Loiter
  • Pause: ok
  • Smartshots:
    • MPCC: OK
    • Orbit: OK
    • FollowMe - Leash: NOT OK - Solo always went into Orbit instead
    • other Smartshots not yet tested.
  • Max Altitude/Max distance settings: Solo stops correctly at fence, BUT no acoustic/haptic feedback when hitting the fence. RTH option does not work, regardless of settings in Solex
  • Return to Me: NOT OK when set in Solex. Solo just shortly goes into Guided, then back in Loiter
  • The Land detector requires further tuning - I almost had a flip after touchdown once (flat surface, no wind)
  • GoPro always turns on on power on, but not always powers off at shutdown
  • all GoPro settings of Solex work fine
  • Speed sliders in Solex work fine
  • Gimbal: works ok, no limping even in hard turns and maneuvres, BUT: Gimbal control by Controller paddle ONLY works when I once touch the Gimbal contol slider in the Solex app. Very strange behaviour.
  • Bigger problem: neither the Controller nor Solex displays the Distance value. Controller always displays a Zero, Solex a -100cm distance. In MP, however Distance to homepoint is correctly shown. All other params are displayed correctly. Could this be caused by a conflict with MP connected in parallel or a change in the Mavlink protocol? @rmackay9

Not yet tested: Pano, Selfie, Zipline smartshots, Solex-Geofence, failsafes, PosHold, and high speed flights in Manual mode.

@Pedals2Paddles I will send you my param file later today.

Awesome summary. Set GND_EFEECT_COMP=1 the landing issue will go away immediately. The Solo version of Arducopter has it built in so there is no parameter. Turning on this parameter in master will make land and stay put every time.

1 Like

With a 99% certainty you are avoiding the fence, not hitting/breaking it. That’s a feature introduced in 3.4

I should better have said “stops correctly when approaching the set max distance or max altitude” :wink:
I have not tested the geofence yet.

Ah yes! FENCE_MARGIN is meters the aircraft will try to stay away from the fence. So it’s probably actually stopping short of the fence, which is preventing the fence breach actions from happening. This is something we’ll need to document well for the Solo users. It’s especially important to understand if someone is creating a fairly small fenced area like a back yard. The margin could be larger than the yard.

resumed testing from today on some of the outstanding topics:

  • Flight tests at max speed in Loiter and AltHold with high amp peak loads in radical maneuvres: ok
  • Outstanding test of POSHOLD flight mode OK
  • Smartshots: zipline, ok
  • Gimbal now fully works (with MNT_DEFLT_MODE set to 3)
  • Land detector works well now (with GRND_EFFECT_COMP set to 1)
  • Solex Geofencing works

Not OK:

  • Smartshots follome, Selfie (whereas Selfie is rather a Solo issue)
  • GoPro does not turn off, but only turns on (GP4B on v3 firmware)
  • No distance display on controller and Solex - however in in MP works (works for @Pedals2Paddles)
  • No haptic feedback when Solo approaches max distance or altitude limits (Solo starts drifting sideways once the distance limit is reached)
  • No RTH when Solo approaches max distance/altitude limits despite of FENCE_ACTION setting

Major issue is that RTH and RTM do not work in all situations I tested (triggered by RTH button, failsafes)
Strange thing is that RTH worked until yesterday, see logfile here:
https://1drv.ms/u/s!AnKeW8KMoCcyizw1sp328YFccOva
But from today onwards it repeatedly breaks. When triggered, Solo goes into RTH for about 2-3 sec and starts climbing a couple of meters, then switches back to loiter. See log here:
https://1drv.ms/u/s!AnKeW8KMoCcyiztnh-1Q17slW7ll

My current parameter file:
https://1drv.ms/u/s!AnKeW8KMoCcyizp8J_KkOwvcWS_6
Would be great if someone of the developers could have a look into the RTH thing - this is the only major defect I have found so far in 3.5 running on Solo. Otherwise very decent performance - big thank you to the dev team!

BOOM. From the Solo’s Shot Log file. This explains everything! Is the home location being stored differently on the pixhawk now compared to how it was in 3.3?

Mission Planner shows the correct home location because it’s getting it straight from the Pixhawk the way it always does. But the companion computer is having a hard time getting it. And that’s why the guided mode RTH and controller’s home distance isn’t working.

The Solo’s RTH/RTM uses the companion computer’s own routine via guided mode on the pixhawk. All the stuff it does in guided mode is logged in the “shot log” file. So even the RTH is “smart shot” that it logs. Looks like the companion computer is having a hard time obtaining the home location based on AttributeError: ‘NoneType’ object has no attribute 'lat’

The shows the most recent calls, to include which call bombed out. Upon not being able to obtain the home location, it gave up and kicked it back to loiter.

Mar 31 21:21:01 3dr_solo local2.info shot: [shot]: Entering shot Return Home.
Mar 31 21:21:01 3dr_solo local2.info shot: [RC] Enabling stick remapping
Mar 31 21:21:01 3dr_solo local2.info shot: [RTL] Try Guided
Mar 31 21:21:01 3dr_solo local2.info shot: [RC] detach from rc_ipc.put
Mar 31 21:21:01 3dr_solo local2.info shot: [RC] Disabling stick remapping
Mar 31 21:21:01 3dr_solo local2.info shot: Traceback (most recent call last):
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/shotManager.py", line 136, in Run
Mar 31 21:21:01 3dr_solo local2.info shot:     self.buttonManager.parse()
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/buttonManager.py", line 105, in parse
Mar 31 21:21:01 3dr_solo local2.info shot:     self.handleButtons((msg[1],msg[2]))
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/buttonManager.py", line 267, in handleButtons
Mar 31 21:21:01 3dr_solo local2.info shot:     self.shotMgr.enterShot(shots.APP_SHOT_RTL)
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/shotManager.py", line 273, in enterShot
Mar 31 21:21:01 3dr_solo local2.info shot:     self.curController = ShotFactory.get_shot_obj(shot, self.vehicle, self)
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/shotFactory.py", line 31, in get_shot_obj
Mar 31 21:21:01 3dr_solo local2.info shot:     return shot_class(args[0], args[1])
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/returnHome.py", line 82, in __init__
Mar 31 21:21:01 3dr_solo local2.info shot:     self.returnAlt = self.coneOfAwesomeness(self.returnAlt)
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/returnHome.py", line 152, in coneOfAwesomeness
Mar 31 21:21:01 3dr_solo local2.info shot:     homeDistance = location_helpers.getDistanceFromPoints(self.vehicle.location.global_relative_frame, self.homeLocation)
Mar 31 21:21:01 3dr_solo local2.info shot:   File "/usr/bin/location_helpers.py", line 16, in getDistanceFromPoints
Mar 31 21:21:01 3dr_solo local2.info shot:     dlat    = (loc2.lat - loc1.lat)
Mar 31 21:21:01 3dr_solo local2.info shot: AttributeError: 'NoneType' object has no attribute 'lat'
Mar 31 21:21:01 3dr_solo local2.info shot: 
Mar 31 21:21:03 3dr_solo local2.info shot: +-+-+-+-+-+-+ Starting up v2.4.1-1 +-+-+-+-+-+-+
Mar 31 21:21:03 3dr_solo local2.info shot: [RC] Disabling stick remapping
Mar 31 21:21:03 3dr_solo local2.info shot: [app]: Ready for connections from app.
Mar 31 21:21:03 3dr_solo local2.info shot: [button]: Creating a new thread to connect to Artoo.
Mar 31 21:21:03 3dr_solo local2.info shot: [button]: read in button mappings
Mar 31 21:21:03 3dr_solo local2.info shot: [button]: Button A - shot FLY, mode Stabilize
Mar 31 21:21:03 3dr_solo local2.info shot: [button]: Button B - shot FLY, mode FLY: Manual
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: read enabled value from settings of 1.
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending gimbal enabled param (GMB_GP_CTRL) to 1.000000
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: Inited GoProManager
Mar 31 21:21:03 3dr_solo local2.info shot: [RewindManager] Init
Mar 31 21:21:03 3dr_solo local2.info shot: [shot]: No gimbal detected.
Mar 31 21:21:03 3dr_solo local2.info shot: [shot]: Restart in air.
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: Gopro status changed to 2
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: Gopro recording status changed to 1
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending Gopro state to app
Mar 31 21:21:03 3dr_solo local2.info shot: [app]: Can't send packet - app is not connected!
Mar 31 21:21:03 3dr_solo local2.info shot: [app]: Can't send packet - app is not connected!
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 11
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 10
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: Gopro get request for command 4 failed with status 1
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 9
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: Gopro video resolution changed to 8
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: Gopro video frame rate changed to 4
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending Gopro state to app
Mar 31 21:21:03 3dr_solo local2.info shot: [app]: Can't send packet - app is not connected!
Mar 31 21:21:03 3dr_solo local2.info shot: [app]: Can't send packet - app is not connected!
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 8
Mar 31 21:21:03 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 7
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: Gopro photo resolution changed to 4
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending Gopro state to app
Mar 31 21:21:04 3dr_solo local2.info shot: [app]: Can't send packet - app is not connected!
Mar 31 21:21:04 3dr_solo local2.info shot: [app]: Can't send packet - app is not connected!
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 6
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 5
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 4
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: Gopro get request for command 10 failed with status 1
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 3
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: Gopro get request for command 11 failed with status 1
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 2
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 1
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: sending message from the queue.  Size is now 0
Mar 31 21:21:04 3dr_solo local2.info shot: [callback]: Mode changed from RTL -> LOITER
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: Gopro get request for command 10 failed with status 1
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: Gopro get request for command 11 failed with status 1
Mar 31 21:21:04 3dr_solo local2.info shot: [gopro]: Gopro get request for command 13 failed with status 1
Mar 31 21:21:04 3dr_solo local2.info shot: [RewindManager] reset Spline to size 20
Mar 31 21:21:05 3dr_solo local2.info shot: [button]: Connected to Artoo.
Mar 31 21:21:05 3dr_solo local2.info shot: [button]: sending FLY to Artoo as mode

The relevant python code from the companion computer that requesting the home location is as follows. It appears Jason was not happy with this method, but Dronekit wasn’t doing the job at the time to do it better.:

def loadHomeLocation(self):
        ''' Hack method to avoid Dronekit issues with loading home from vehicle'''
        if self.vehicle is None:
            logger.log("no Vehicle!")
                
        #load home from vehicle
        # total grossness for getting HOME_LOCATION! Should be done properly in dronekit instead
        self.vehicle.add_message_listener('MISSION_ITEM', self.handleMissionItem)
        # formulate mavlink message to request home position
        self.vehicle.message_factory.mission_request_send(0, 1, 0)  # target_system, target_component, seq
        #logger.log("loading home from vehicle2")

    def handleMissionItem(self, vehicle, name, msg):
        ''' Handles callback for home location from vehicle '''
        self.vehicle.remove_message_listener('MISSION_ITEM', self.handleMissionItem)
        self.homeLocation = LocationGlobal(msg.x, msg.y, msg.z)
        logger.log("[RewindManager] loaded home %f %f, alt %f" % (self.homeLocation.lat, self.homeLocation.lon, self.homeLocation.alt))
        # Send home to the App
        self.updateAppOptions()
        

    def updateAppOptions(self):
        ''' send home loc to App '''
        # f = float_32
        # d = float_64
        packet = struct.pack('<IIddf', app_packet.SOLO_HOME_LOCATION, 20, self.homeLocation.lat, self.homeLocation.lon, self.homeLocation.alt)
        self.shotmgr.appMgr.sendPacket(packet)

Seeing that it appears to be requesting mission waypoint zero, the home location, it reminded me. When it was working properly last weekend, I had missions loaded. Since then, I had reset the pixhawk. So anything mission related was gone. So I loaded a mission and tested again today. The problem did not present itself. I could even load a blank mission to clear it and it still continued to work fine. Power cycled, still worked fine. I could change takeoff locations around the field, and it always picked up the new home location and the RTH guided mode thing worked properly.

So, that leads me to this question: what has changed between 3.3 and now as it relates to waypoint zero home location that the companion computer is looking for?

[details=Here is an example of 2 different RTH failures in the shot log:
]This text will be hidden[/details]
Mar 31 06:39:40 3dr_solo local2.info shot: [shot]: Entering shot Return Home.
Mar 31 06:39:40 3dr_solo local2.info shot: [RTL] Try Guided
Mar 31 06:39:40 3dr_solo local2.info shot: [RC] detach from rc_ipc.put
Mar 31 06:39:40 3dr_solo local2.info shot: [RC] Disabling stick remapping
Mar 31 06:39:40 3dr_solo local2.info shot: Traceback (most recent call last):
Mar 31 06:39:40 3dr_solo local2.info shot: File “/usr/bin/shotManager.py”, line 136, in Run
Mar 31 06:39:40 3dr_solo local2.info shot: self.buttonManager.parse()
Mar 31 06:39:40 3dr_solo local2.info shot: File “/usr/bin/buttonManager.py”, line 105, in parse
Mar 31 06:39:40 3dr_solo local2.info shot: self.handleButtons((msg[1],msg[2]))
Mar 31 06:39:40 3dr_solo local2.info shot: File “/usr/bin/buttonManager.py”, line 267, in handleButtons
Mar 31 06:39:40 3dr_solo local2.info shot: self.shotMgr.enterShot(shots.APP_SHOT_RTL)
Mar 31 06:39:40 3dr_solo local2.info shot: File “/usr/bin/shotManager.py”, line 273, in enterShot
Mar 31 06:39:40 3dr_solo local2.info shot: self.curController = ShotFactory.get_shot_obj(shot, self.vehicle, self)
Mar 31 06:39:40 3dr_solo local2.info shot: File “/usr/bin/shotFactory.py”, line 31, in get_shot_obj
Mar 31 06:39:40 3dr_solo local2.info shot: return shot_class(args[0], args[1])
Mar 31 06:39:40 3dr_solo local2.info shot: File “/usr/bin/returnHome.py”, line 81, in init
Mar 31 06:39:40 3dr_solo local2.info shot: self.returnAlt = max((self.vehicle.location.global_relative_frame.alt + RTL_CLIMB_MIN), self.rtlAltParam)
Mar 31 06:39:40 3dr_solo local2.info shot: TypeError: unsupported operand type(s) for +: ‘NoneType’ and 'int’
Mar 31 06:39:40 3dr_solo local2.info shot:
Mar 31 06:39:43 3dr_solo local2.info shot: ±±±±±±+ Starting up v2.4.1-1 ±±±±±±+[details=Summary][/details]

Here is another example of a failed RTH in the shot log:

This text will be hidden

Apr  1 08:20:21 3dr_solo local2.info shot: [shot]: Entering shot Return Home.
Apr  1 08:20:21 3dr_solo local2.info shot: Entering shot Return Home.
Apr  1 08:20:21 3dr_solo local2.info shot: [RC] Enabling stick remapping
Apr  1 08:20:21 3dr_solo local2.info shot: [RTL] Try Guided
Apr  1 08:20:21 3dr_solo local2.info shot: [RC] detach from rc_ipc.put
Apr  1 08:20:21 3dr_solo local2.info shot: [RC] Disabling stick remapping
Apr  1 08:20:22 3dr_solo local2.info shot: Traceback (most recent call last):
Apr  1 08:20:22 3dr_solo local2.info shot:   File "/usr/bin/shotManager.py", line 136, in Run
Apr  1 08:20:22 3dr_solo local2.info shot:     self.buttonManager.parse()
Apr  1 08:20:22 3dr_solo local2.info shot:   File "/usr/bin/buttonManager.py", line 105, in parse
Apr  1 08:20:22 3dr_solo local2.info shot:     self.handleButtons((msg[1],msg[2]))
Apr  1 08:20:22 3dr_solo local2.info shot:   File "/usr/bin/buttonManager.py", line 267, in handleButtons
Apr  1 08:20:22 3dr_solo local2.info shot:     self.shotMgr.enterShot(shots.APP_SHOT_RTL)
Apr  1 08:20:22 3dr_solo local2.info shot:   File "/usr/bin/shotManager.py", line 273, in enterShot
Apr  1 08:20:22 3dr_solo local2.info shot:     self.curController = ShotFactory.get_shot_obj(shot, self.vehicle, self)
Apr  1 08:20:22 3dr_solo local2.info shot:   File "/usr/bin/shotFactory.py", line 31, in get_shot_obj
Apr  1 08:20:22 3dr_solo local2.info shot:     return shot_class(args[0], args[1])
Apr  1 08:20:22 3dr_solo local2.info shot:   **File "/usr/bin/returnHome.py", line 82, in __init__**
**Apr  1 08:20:22 3dr_solo local2.info shot:     self.returnAlt = self.coneOfAwesomeness(self.returnAlt)**
Apr  1 08:20:22 3dr_solo local2.info shot:   File "/usr/bin/returnHome.py", line 152, in coneOfAwesomeness
Apr  1 08:20:22 3dr_solo local2.info shot:     homeDistance = location_helpers.getDistanceFromPoints(self.vehicle.location.global_relative_frame, self.homeLocation)
Apr  1 08:20:22 3dr_solo local2.info shot:   File "/usr/bin/location_helpers.py", line 16, in getDistanceFromPoints
**Apr  1 08:20:22 3dr_solo local2.info shot:     dlat    = (loc2.lat - loc1.lat)**
**Apr  1 08:20:22 3dr_solo local2.info shot: AttributeError: 'NoneType' object has no attribute 'lat'**[/details]

Difference marked with asteriks. Hope this helps to trace down the issue.

Dang nice work guys
had no idea solo would still work with Solex and 3.5
exciting